perm filename DFTP.MAC[NET,MRC]10 blob
sn#267704 filedate 1977-03-06 generic text, type T, neo UTF8
TITLE DFTP Datacomputer File Transfer Program
; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers: WRB@CCA(general, TENEX, TOPS-10)
; MRC@MIT-AI(ITS, SU-AI, TOPS-10)
IFNDEF F.TENX,<F.TENX==1> ; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX/TWENEX
IFNDEF F.PCAP,<F.PCAP==0> ; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED
IFNDEF F.SAIL,<F.SAIL==0> ; -1 IF TOPS-10 VERSION FOR SAIL
IFN F.SAIL,<F.TENX==0>
IF1,<
IFL F.TENX,<PRINTX ITS...>
IFE F.TENX,<IFE F.SAIL,<PRINTX TOPS-10...>
IFN F.SAIL,<PRINTX SAIL...>
>
IFG F.TENX,<PRINTX TENEX...>
IFN F.PCAP,<PRINTX Privileged capabilities restricted>
>
; ***DEFINITIONS***
DCHOST==37
DCSOKT==203
DEFALO==12
SIZBLK==200
SIZPAG==1000
LBSIZE==100
SBSIZE==20
; REGISTER DEFINITIONS
R1==1
R2==2
R3==3
R4==4
R5==5
R6==6
R7==7
R10==10
R11==11
R12==12
R13==13
R14==14
R15==15
R16==16
R17==17
; (SCRATCH REGISTERS)
X1==1
X2==2
X3==3
X4==4
; (COMMONLY USED REGISTERS)
IO==R5
BP==R6
FLAG==R15
UTIL==R16
STAK==R17
; (TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
TCIO==R2 ; IO(REGISTER)
TCIBP==R3 ; B(YTE)P(OINTER)
TCIACB==R4 ; A(DDRESSOF)C(ONTROL)B(LOCK)
TCITLP==R5 ; T(RACE)L(IST)P(OINTER)
TCITCC==R6 ; T(RACE)C(OMMAND)C(OUNTER)
TCIPBP==R7 ; P(ARALLEL)B(YTE)P(OINTER)
TCIPCC==R10 ; P(ARALLEL)C(HARACTER)C(OUNTER)
TCISBP==R11 ; S(ERIAL)B(YTE)P(OINTER)
TCISCC==R12 ; S(ERIAL)C(HARACTER)C(OUNTER)
TCIMAC==R13 ; MA(TCHES--)C(OMMANDS)
TCIMAN==R14 ; MA(TCHES--)N(ULLCHARACTER)
; MACRO DEFINITIONS
SALL
IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>> ; ABS ASSEMBLY ON ITS
DEFINE BEGINR(SAVLST,%RETN)
< ..SAVL==0
..SAVC==0
IFIDN <SAVLST><ALL>,<..SAVL==77777>
IFDIF <SAVLST><ALL>,<
IRP SAVLST,<
IFG <SAVLST>-20,<!!
PRINTX SAVLST NOT A REGISTER>
IFLE <SAVLST>-20,<
IFN ..SAVL&1←SAVLST,<!!
PRINTX SAVLST SAVED TWICE>
..SAVL==..SAVL!1←SAVLST
..SAVC==..SAVC+1>>>
IFN ..SAVL,<
..REG==17
REPEAT 20,<
IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
..REG==..REG-1>>
DEFINE .%RETN <%RETN> ; UNIQUE LOCATION FOR RETURN AND ENDR
DEFINE .%RETL <%RETN':!>
..SFLG==0 ; LARGEST SKIP RETURN
>
; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
; JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
; ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>
; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>
; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE ENDR(SK,N)
< IFB <SK>,<..N==0>
IFIDN <SK><SKIP>,<..N==N
IFG <..N-..SFLG>,<..SFLG==..N>>
IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
REPEAT ..SFLG,<
AOS -..SAVC(STAK)>>
.%RETL
..REG==0
REPEAT 20,<
IFN ..SAVL&1←..REG,<POP STAK,..REG
..SAVL==..SAVL-1←..REG>
..REG==..REG+1>
POPJ STAK,>
DEFINE CALLR(ROUTIN)
< PUSHJ STAK,ROUTIN>
DEFINE TAIN(MSG)
< HRRZI X1,MSG
CALLR $TAIN$>
DEFINE TCIN(CLIST,RSTR)
< MOVE TCIO,[RSTR,,CLIST]
CALLR $TCIN$>
DEFINE TCIL(ARG)
< ..CMCH==0
..CMWD==0
..CNUM==0
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..CNUM==..CNUM+1
..IDX==0
IRPC ARG<..IDX==..IDX+1>
IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
..FLAG==<-..FLAG>>
IFL ..FLAG,<!!
PRINTX BAD ARGUMENTS TO TCIN>
..CMWD==<<<..CMCH-1>/5>+1>
..LOC1==.
..LOC2==..LOC1+4
..LOC3==..LOC2+..CNUM
RELOC ..LOC3
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..IDX==0
IRPC ARG<..IDX==..IDX+1>
..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
ASCII /ARG/
IFG ..IDX,<REPEAT ..IDX, <0>>
..LOC3==.>
IFL ..FLAG,<
RELOC ..LOC2
ARG
..LOC2==.
RELOC ..LOC3>
..FLAG==<-..FLAG>>
RELOC ..LOC1
..LOC2
..CNUM
..CMCH
..CMWD
RELOC ..LOC3>
DEFINE TSIN(BUFFER,BUFS,MSG,NOECHO)
< MOVE IO,[BUFFER,,5*BUFS]
IFB <NOECHO>,< HRRZI UTIL,MSG>
IFNB <NOECHO>,< HRROI UTIL,MSG>
CALLR $TSIN$>
DEFINE TNIN(MSG,RADIX)
< IFB <RADIX>,< MOVE IO,[MSG,,↑D10]>
IFNB <RADIX>,< MOVE IO,[MSG,,RADIX]>
CALLR $TNIN$>
DEFINE TNOUT(REG,RADIX)
< IFN <X1-REG>,< MOVE X1,REG>
IFB <RADIX>,< HRRZI X2,↑D10>
IFNB <RADIX>,< HRRZI X2,RADIX>
CALLR $NOUT$>
DEFINE DCNOUT(REG,RADIX)
< IFN <X1-REG>,< MOVE X1,REG>
IFB <RADIX>,< HRROI X2,↑D10>
IFNB <RADIX>,< HRROI X2,RADIX>
CALLR $NOUT$>
DEFINE PATH(STRING,FLAGS)
< IFB <FLAGS>,< HRRZI FLAG,STRING>
IFNB <FLAGS>,<
HRRI FLAG,STRING
HRLI FLAG,FLAGS>
CALLR $PATH$>
DEFINE SCOPY(SOURCE,DESTIN)
< ILDB 0,SOURCE
JUMPE 0,.+3
IDPB 0,DESTIN
JRST .-3
MOVE SOURCE,DESTIN
IDPB 0,SOURCE>
; SYSTEM DEPENDENT DEFINITIONS
; ((ITS))
IFL F.TENX,<
SEARCH SITS
LOC 150
OPDEF THUD [.LOSE 1000]
; Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO. First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).
INIT: MOVSI (JUMPA)
HRR .JBSA##
.BREAK 12,[400001,,] ;set start address
SETZ 1,
MOVE [1,,2]
BLT 150
.BREAK 16,100000 ;return to DDT
JRST DFTP
; I/O Channels
TTI==1 ; TTY I/O
TTO==2
DCI==3 ; Datalanguage I/O
DCO==4
ICP==5 ; ICP channel
DDI==6 ; Data I/O
DDO==7
LCI==10 ; Local input
LCO==11 ; Local output
; ITS network definitions
%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11
DEFINE TBIN(REG)
< .IOT TTI,REG
CAIN REG,15
MOVEI REG,12
CAIG REG,"z"
CAIGE REG,"a"
CAIA
TRZ REG," ">
OPDEF TBOUT [.IOT TTO,]
DEFINE TSOUT(STRING)
< IRP STRING
< MOVEI X1,STRING
CALLR $STRIN
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$STRIN: BEGINR
HRLI X1,(POINT 7,) ; build a byte pointer
$STRI1: ILDB X1 ; get a character from string
JUMPE RETN(0) ; quit when done
.IOT TTO, ; output the character
JRST $STRI1
ENDR
DEFINE DCBIN(REG)
< .IOT DCI,REG
JUMPLE REG,QUIT2
SKIPE FLAGDD
.IOT TTO,REG
>
OPDEF DCBOUT [.IOT DCO,]
DEFINE DCSOUT(STRING)
< IRP STRING
< MOVEI X1,STRING
CALLR $DSTRI
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$DSTRI: BEGINR
HRLI X1,(POINT 7,) ; build a byte pointer
$DSTR1: ILDB X1 ; get a character from string
JUMPE RETN(0) ; quit when done
.IOT DCO, ; output the character
SKIPE FLAGDD ; show DATALANGUAGE?
.IOT TTO,
JRST $DSTR1 ; and loop for more
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
TWOSEG
RELOC 400000
OPDEF THUD [JSP FLAG,OOPS]
IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>
DCCHAN==1
DDCHAN==2
LFCHAN==3
LDCHAN==4
; DEFINITIONS FROM "IMP.MAC"
.IBDEV==0
.IBSTT==1
.IBERR==1
.IBLCL==2
.IBHST==3
.IBRMT==4
.IUSTT==0
.IUCON==3
.IUCLS==4
.IULSN==5
.IULHS==15
.IESOF==5
.IESKT==11
.IEDWN==13
.IETIM==15
DEFINE TBIN(REG)
< TTCALL 0,REG
CAIE REG,175
CAIN REG,176
MOVEI REG,33
CAILE REG,"Z"+40
JRST .+3
CAIL REG,"A"+40
SUBI REG,40>
OPDEF TBOUT [TTCALL 1,]
DEFINE TSOUT(STRING)
< IRP STRING
< TTCALL 3,STRING>>
DEFINE DCBIN(REG)
< SKIPG DCIBUF+2
CALLR NUTMI
SOS DCIBUF+2
ILDB REG,DCIBUF+1
JUMPE REG,.-4>
DEFINE DCBOUT(REG)
< IDPB REG,DCOBUF+1
OUT DCCHAN,
JRST .+2
JRST NETEOT>
DEFINE DCSOUT(STRING)
< IRP STRING
< HRRZI X1,STRING
CALLR NUTMO>
OUT DCCHAN,
JRST .+2
JRST NETEOT>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SEARCH STENEX
THUD==-1
DEFINE TBIN(REG)
< PBIN
CAILE X1,"Z"+40
JRST .+3
CAIL X1,"A"+40
SUBI X1,40
IFN <X1-REG>,< HRRZI REG,(X1)>>
DEFINE TBOUT(REG)
< IFN <X1-REG>,< HRRZI X1,(REG)>
PBOUT>
DEFINE TSOUT(STRING)
< IRP STRING
< HRROI X1,STRING
PSOUT>>
DEFINE DCBIN(REG)
< MOVE X1,DCIJFN
BIN
SKIPN FLAGDD
JRST .+3
HRRZI X1,(X2)
PBOUT
HRRZI REG,(X2)>
DEFINE DCBOUT(REG)
< MOVE X1,DCOJFN
HRRZI X2,(REG)
BOUT
MOVEI X2,21
MTOPR>
DEFINE DCSOUT(STRING)
< ..IDX==1
IRP STRING<..IDX==..IDX+2>
SKIPN FLAGDD
JRST .+..IDX
IRP STRING
< HRROI X1,STRING
PSOUT>
MOVE X1,DCOJFN
SETZ X3,
IRP STRING
< HRROI X2,STRING
SOUT>
MOVEI X2,21
MTOPR>
>
; (((↑↑↑)))
; "<FILE"> FILE LIST(0,55,256),CAT,B=36
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),C=1
; EXTENSION STRING(0,3,79),C=1
; STATUS STRING(1),F=' '
; CREATIONDATE STRING(1,18,79),F='?',C=1
; SAVEDATE STRING(1,18,79),F='?',C=1
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; INDEX BYTE,V=I
; COUNT BYTE
; DATA STRING(0,497,500000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(79),F=' ',D=0
; EXTENSION STRING(79),F=' ',D=0
; CREATIONDATE STRING(19),F=' ',D=0
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,437,1000000),B=36,D=0
; CHECKSUM BYTE
; END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
; FILE STRUCTURE
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D=0
; EXTENSION STRING(0,3,79),D=0
; CREATIONDATE STRING(0,18,79),D=0
; SAVEDATE STRING(0,18,79),D=0
; VERSION INTEGER
; LENGTH INTEGER
; BYTESIZE INTEGER
; END
; COUNT BYTE
; DATA STRING(0,497,1000000),B=36,C=COUNT
; CHECKSUM BYTE
; END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
; FILE STRUCTURE,P=EOR
; PREFIX STRING(5),F=' '
; HEADER STRUCTURE
; FILENAME STRING(1,6,79),D='.'
; EXTENSION STRING(0,3,79),D=';'
; VERSION INTEGER(1,10),D=' '
; STATUS STRING(1),D=' '
; CREATIONDATE STRING(1,18,79),D=' '
; SAVEDATE STRING(1,18,79),D=' '
; LENGTH INTEGER(1,10),D='('
; BYTESIZE INTEGER(1,10),D=')'
; END
; END;
; ***PROGRAM***
DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ LCLSNM]
THUD ; INSIST ON AN ITS DIRECTORY
.CLOSE ; THIS WILL PREVENT A THUD IN
; LOCOO DUE TO BAD DIRECTORY
; STORED IN LCLSNM. LOCAL-CONNECT
; CHECKS.
>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
MOVE STAK,[IOWD STSIZ,STBEG]
CALLR S$INIT
CALLR D$INIT
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,< ; HACK FOR ITS VERSION FOR AUTOENABLE
MOVEI UTIL,CMDM3
.OPEN ['DSK'
SIXBIT/←DFTP←/
SIXBIT/ENABLE/]
>
MOVEI UTIL,CMDM2 ; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
; (((ITS)))
IFL F.TENX,<
MOVEI UTIL,CMDM2
.SUSET [.RXUNAME,,X1]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ X1]
MOVEI UTIL,CMDM1 ; NO ITS DIRECTORY
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
MOVEI UTIL,CMDM1
; (!DISABLE!)
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEI UTIL,CMDM1
MOVEI X1,400000 ; FOR THIS FORK
RPCAP
TRNE X2,600000 ; (1B18+1B19) WHEEL OR OPER
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
MOVEM UTIL,CMDMOD
JRST CMDCMD
CMDNEW: TSOUT <CRLF>
CMDCMD: JRST @CMDMOD
CMDM1: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC1,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM2: TSOUT <[ASCIZ/*/]>
TCIN (CMDMC2,[ASCIZ/*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM3: TSOUT <[ASCIZ/!/]>
TCIN (CMDMC3,[ASCIZ/!/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
CALO: PATH ([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
JRST CMDCMD
TSOUT <[ASCIZ/ Megabits: /]>
CALO1: TNIN ([ASCIZ/ Megabits: /])
JRST CMDCMD
JUMPN IO,CALO2
MOVEI IO,"G"-100
TBOUT <IO>
JRST CALO1
CALO2: MOVEM IO,ABUF
TSOUT <CRLF>
CALLR DALO
JRST CMDCMD
CATT: PATH ([ASCIZ/ ATTACH /],PATHNR!PATHCT)
JRST CMDCMD
CALLR DATT
JRST CMDCMD
CCHA: PATH ([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
JRST CMDCMD
CALLR DCHA
JRST CMDCMD
CCON: PATH ([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
JRST CMDCMD
CALLR DCON
JRST CMDCMD
CCRE: PATH ([ASCIZ/ CREATE /],PATHNR!PATHCA)
JRST CMDCMD
CALLR DCRE
JRST CMDCMD
CDEL: PATH ([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
JRST CMDCMD
CALLR DDEL
JRST CMDCMD
CDIR: PATH ([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
MOVE IO,CMDMOD
CAIN IO,CMDM3
JRST CDIR1
TSOUT <[ASCIZ/**/]>
TCIN (CDIRC,[ASCIZ/**/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR1: TSOUT <[ASCIZ/!!/]>
TCIN (CDIRC,[ASCIZ/!!/])
JRST CMDCMD
JRST CDIR2
JRST CDIR3
CDIR2: MOVEI FLAG,DD$T
TSOUT <[ASCIZ/TERSE/]>
CDIR3: TSOUT <CRLF>
CALLR DDIR
JRST CMDCMD
CDIRC: TCIL <TERSE,DD$T,VERBOSE,DD$V>
CDIS: TSOUT <CRLF>
MOVEI UTIL,CMDM2
MOVEM UTIL,CMDMOD
JRST CMDCMD
CENA: TSOUT <CRLF>
MOVEI UTIL,CMDM3
MOVEM UTIL,CMDMOD
JRST CMDCMD
; (((TENEX)))
IFG F.TENX,<
CEXE: HRROI X1,CRLF
PSOUT
HRRZI X1,-1
RFMOD
MOVE R10,X2
RFCOC
MOVE R11,X2
MOVE R12,X3
HRLZI X1,(1B1) ; INFERIOR GETS THIS FORK'S CAPABILITIES
CFORK ; CREATE FORK
THUD
MOVE UTIL,X1
HRLZI X1,(1B2+1B17)
HRROI X2,[ASCIZ/<SYSTEM>EXEC.SAV/]
GTJFN
THUD
HRLI X1,(UTIL)
GET ; LOAD EXEC INTO FORK
MOVE X1,UTIL
SETZ X2,
SFRKV ; START FORK AT MAIN STARTUP
WFORK
KFORK
HRRZI X1,-1
MOVE X2,R10
SFMOD
MOVE X2,R11
MOVE X3,R12
SFCOC
JRST CMDCMD
>
; (((↑↑↑)))
CEXP: PATH ([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
JRST CMDCMD
CALLR DEXP
JRST CMDCMD
CGET: PATH ([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CLIN: TSOUT <CRLF>
CALLR DLIN
JRST CMDCMD
CLIS: PATH ([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
JRST CMDCMD
MOVE IO,CMDMOD
CAIN IO,CMDM3
JRST CLIS1
TSOUT <[ASCIZ/**/]>
TCIN (CLISC1,[ASCIZ/**/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS1: TSOUT <[ASCIZ/!!/]>
TCIN (CLISC2,[ASCIZ/!!/])
JRST CMDCMD
JRST CLIS2
JRST CLIS3
CLIS2: MOVEI FLAG,DL$T
TSOUT <[ASCIZ/TERSE/]>
CLIS3: TSOUT <CRLF>
CALLR DLIS
JRST CMDCMD
CLISC1: TCIL <TERSE,DL$T,VERBOSE,DL$V>
CLISC2: TCIL <PROTECTION,DL$P,TERSE,DL$T,VERBOSE,DL$V>
; (((ITS)))
IFL F.TENX,<
CLOC: TBOUT [" "]
SETZM ABUF
SETZM ABUF+1
MOVE IO,[ABUF,,6]
HRRZI UTIL,[ASCIZ/ LOCAL-CONNECT /]
CALLR $TSIN$
JRST CMDCMD
JUMPE UTIL,[ .SUSET [.RSNAME,,LCLSNM]
TSOUT <[ASCIZ/(default)/],CRLF>
JRST CMDCMD]
TSOUT <CRLF>
SETZM LCLSNM
MOVE X1,[POINT 6,LCLSNM]
MOVE X2,[POINT 7,ABUF]
ILDB X2
SUBI " "
IDPB X1
SOJG UTIL,.-3
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ LCLSNM]
JRST [ TSOUT <[ASCIZ/ (No such directory)/],CRLF,[ASCIZ/ LOCAL-CONNECT/]>
JRST CLOC]
.CLOSE
JRST CMDCMD
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
CLOD: TTCALL 3,CRLF
SETZM LUTDSP
CLOD1: CALLR LUTDS
JRST CMDCMD
TTCALL 1,[" "]
TTCALL 3,LUTDSF
TTCALL 3,CRLF
JRST CLOD1
CLOS: MOVEI IO," "
TTCALL 1,IO
TSIN (UBUF2,SBSIZE,[ASCIZ/ LOCAL-STRUCTURE /])
JRST CMDCMD
TTCALL 3,CRLF
MOVE BP,[440700,,UBUF2]
CLOS1: ILDB IO,BP
JUMPE IO,CLOS2
CAIE IO,":"
JRST CLOS1
SETZ IO,
DPB IO,BP
CLOS2: HRRZI IO,UBUF2
CALLR LUTFN
MOVE IO,LFILE
DEVCHR IO,
TLNE IO,200000
JRST CLOS3
TTCALL 3,[ASCIZ/ (Local structure must be a disk)
/]
JRST CMDCMD
CLOS3: MOVE IO,LFILE
MOVEM IO,LFCHAS+1
JRST CMDCMD
CLOU: TTCALL 3,[ASCIZ/
Project: /]
IFE F.SAIL,<
TNIN ([ASCIZ/ Project: /],10)
JRST CMDCMD
>
IFN F.SAIL,<
SETZM ABUF
MOVE IO,[ABUF,,3]
HRRZI UTIL,[ASCIZ/ Project: /]
CALLR $TSIN$
JRST CMDCMD
SETZ IO,
MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
ILDB X2,X1
JUMPE X2,CLOU1A
LSH IO,6
ADDI IO,-" "(X2)
>
>
CLOU1A: HRLI UTIL,(IO)
JUMPN IO,CLOU1
GETPPN IO,
JFCL
HLLZ UTIL,IO
OUTSTR [ASCIZ/(self)/]
CLOU1: TTCALL 3,[ASCIZ/
Programmer: /]
IFE F.SAIL,<
TNIN ([ASCIZ/ Programmer: /],10)
JRST CMDCMD
>
IFN F.SAIL,<
PUSH STAK,UTIL
SETZM ABUF
MOVE IO,[ABUF,,3]
HRRZI UTIL,[ASCIZ/ Programmer: /]
CALLR $TSIN$
JRST [ POP STAK,UTIL
JRST CMDCMD]
SETZ IO,
POP STAK,UTIL
MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
ILDB X2,X1
JUMPE X2,CLOU2A
LSH IO,6
ADDI IO,-" "(X2)
>
>
CLOU2A: HRRI UTIL,(IO)
JUMPN IO,CLOU2
GETPPN IO,
JFCL
HRR UTIL,IO
OUTSTR [ASCIZ/(self)/]
CLOU2: TTCALL 3,CRLF
RELEAS LDCHAN,
MOVEM UTIL,LDIR
MOVE IO,[SIXBIT/UFD/]
MOVEM IO,LDIR+1
SETZM LDIR+2
IFE F.SAIL,<MOVE IO,[1,,1]>
IFN F.SAIL,<MOVE IO,[SIXBIT/ 1 1/]>
MOVEM IO,LDIR+3
MOVE IO,LFCHAS+1
MOVEM IO,LDCHAS+1
OPEN LDCHAN,LDCHAS
JRST CLOU4
LOOKUP LDCHAN,LDIR
JRST CLOU4
RELEAS LDCHAN,
MOVEM UTIL,LFIPPN
JRST CMDCMD
CLOU4: TTCALL 3,[ASCIZ/ (No such directory)
/]
JRST CMDCMD
>
; (((↑↑↑)))
CNOD: SETZM FLAGDD
JRST CMDNEW
CPUT: PATH ([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CQUI: TAIN <[ASCIZ/ [Confirm]/]>
JRST CMDCMD
JRST CMDCMD
JRST QUIT
CREM: PATH ([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
JRST CMDCMD
CALLR DREM
JRST CMDCMD
CRET: PATH ([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CSOD: SETOM FLAGDD
JRST CMDNEW
CSTO: PATH ([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CTER: SETOM FLAGNN
SETZM FLAGDD
SETZM FLAGTT
JRST CMDNEW
CTTR: SETOM FLAGTT
JRST CMDNEW
CUND: PATH ([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
JRST CMDCMD
CALLR DUND
JRST CMDCMD
CUTR: SETZM FLAGTT
JRST CMDNEW
CVER: SETZM FLAGNN
JRST CMDNEW
; ***PATH INPUT AND TRANSLATION***
; FLAG DEFINITIONS
PATHNR==400000 ; NODE REQUIRED
PATHNP==200000 ; NODE POSSIBLE
PATHNF==100000 ; NODE FOUND
PATHFR==040000 ; FILE REQUIRED
PATHFF==020000 ; FILE FOUND
PATHCT==004000 ; CONTEXT TOP
PATHCA==002000 ; CONTEXT ATTACH
PATHCC==001000 ; CONTEXT CONNECT
PATHLR==000400 ; LOCAL TO REMOTE
PATHRL==000200 ; REMOTE TO LOCAL
PATHAS==000040 ; ALLOW SETS
PATHAD==000020 ; ALLOW (NON-SET) DEFAULT
PATHAV==000010 ; ALLOW VERSIONS
PATHAC==000004 ; ACKNOWLEDGE [CONFIRM]
; PATH INPUT CONTROL
; IN: TCIO -- LAST CHARACTER INPUT (TCIN)
; FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHLR
TLO FLAG,PATHAV
>
; (((↑↑↑)))
MOVEI IO," "
TBOUT <IO>
MOVE IO,[GBUF1,,5*LBSIZE]
SETZ UTIL,
CALLR P$IN
RETURN
PUSH STAK,IO
MOVE IO,[GBUF1,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
POP STAK,IO
MOVEM UTIL,VBUF
TLNN FLAG,PATHAC
JRST PAT$10
TAIN <[ASCIZ/ [Confirm]/]>
RETURN
RETURN
RETURN SKIP,1
PAT$10: TLNE FLAG,PATHRL!PATHLR
JRST PAT$11
TSOUT <CRLF>
RETURN SKIP,1
PAT$11: PUSH STAK,IO
MOVE IO,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
TLNE FLAG,PATHRL
SETZ UTIL,
>
; (((↑↑↑)))
CALLR P$LF
POP STAK,IO
CAIN IO,33
JRST PAT$20
CAIN IO," "
JRST PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12: TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12: SKIPE LJFN
JRST .+3
HRROI X1,CRLF
PSOUT
>
; (((↑↑↑)))
RETURN SKIP,1
PAT$20: TLNE FLAG,PATHLR
JRST PAT$21
TLNE FLAG,PATHRL
JRST PAT$22
JRST PAT$23
PAT$21: TLNE FLAG,PATHNF
JRST PAT$12
; (((TENEX)))
IFG F.TENX,<
TLZ FLAG,PATHAV
>
; (((↑↑↑)))
JRST PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22: TLZ FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22: SKIPN LJFN
JRST .+4
HRROI X1,CRLF
PSOUT
RETURN SKIP,1
TLZ FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23: TSOUT <[ASCIZ/ [As] /]>
MOVE IO,[GBUF2,,5*LBSIZE]
MOVE UTIL,[GBUF1,,[ASCIZ/ [As] /]]
CALLR P$IN
RETURN
TLNE FLAG,PATHLR
JRST PAT$24
TLNE FLAG,PATHRL
JRST PAT$25
RETURN
PAT$24: MOVE IO,[GBUF2,,NBUF]
MOVE UTIL,[FBUF,,EBUF]
CALLR P$PP
MOVEM UTIL,VBUF
TSOUT <CRLF>
RETURN SKIP,1
PAT$25: MOVE IO,[GBUF2,,GBUF1]
MOVE UTIL,[FSBUF,,ESBUF]
CALLR P$PP
MOVE IO,[FSBUF,,ESBUF]
CALLR P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SKIPE LJFN
JRST .+3
HRROI X1,CRLF
PSOUT
>
; (((↑↑↑)))
ENDR SKIP,1
; PATH INPUT
; IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
; UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
; FLAG -- (SAME AS $PATH$)
; OUT: IO -- LAST CHARACTER INPUT
; UTIL -- COUNT OF CHARACTERS
; FLAGS:
P$I$AE==400000 ; ANCHOR ENCOUNTERED (<)
P$I$DE==200000 ; DESCENDER ENCOUNTERED (>,.)
P$I$SE==100000 ; SET ENCOUNTERED (*)
P$I$TE==040000 ; TRAILING NODE SET ENCOUNTERED (**)
P$I$PW==010000 ; INPUT PASSWORD
P$I$CC==004000 ; <
P$I$CA==002000 ; <<
P$I$CT==001000 ; <<<
P$I$EP==000400 ; EXTENSION BEING PROCESSED
P$I$VP==000200 ; VERSION BEING PROCESSED
;
P$IN: BEGINR <BP,R10,R11,R12,R13>
SETZ R10,
MOVE R11,IO
MOVE R12,UTIL
HLR BP,IO
HRLI BP,(POINT 7,)
SETZ UTIL,
P$ICHR: TBIN <IO>
CAIN IO,"R"-100
JRST P$IREP
CAIN IO,"A"-100
JRST P$IDEL
CAIN IO,"U"-100
JRST P$IENR
CAIN IO,"X"-100
JRST P$IENR
CAIN IO,177
IFE F.TENX,< JRST P$IDEL>
IFN F.TENX,< JRST P$IENR>
CAIN IO,15
JRST P$ICHR
CAIN IO,12
JRST P$IEND
CAIN IO,33
JRST P$IEND
CAIN IO,37
JRST P$IEND
CAIGE IO," "
JRST P$IBAD
CAIN IO,42
JRST P$IBAD
TRNE R10,P$I$TE
JRST P$IBAD
CAIL UTIL,(R11)
JRST P$IBAD
TRNE R10,P$I$PW
JRST P$ICHP
CAIN IO," "
JRST P$IEND
CAIN IO,"?"
JRST P$IBAD
CAIN IO,"*"
JRST P$ISS
TRNE R10,P$I$VP
JRST P$ISVN
CAIN IO,";"
JRST P$ISVS
CAIN IO,":"
JRST P$IPON
CAIN IO,"<"
JRST P$ISA
CAIN IO,">"
JRST P$ISD1
CAIN IO,"."
JRST P$ISD2
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$AE!P$I$DE
P$ICHE: IDPB IO,BP
TBOUT <IO>
AOJA UTIL,P$ICHR
P$ICHP: CAIN IO,">"
JRST P$IPOF
CAIN IO,"'"
JRST P$IBAD
IDPB IO,BP
AOJA UTIL,P$ICHR
P$ISA: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNN R10,P$I$CC
JRST P$ISA1
TRNN R10,P$I$CA
JRST P$ISA2
TRNN R10,P$I$CT
JRST P$ISA3
JRST P$IBAD
P$ISA1: JUMPN UTIL,P$IBAD
TRO R10,P$I$AE!P$I$CC
JRST P$ICHE
P$ISA2: CAIE UTIL,1
JRST P$IBAD
TRO R10,P$I$AE!P$I$CA
JRST P$ICHE
P$ISA3: CAIE UTIL,2
JRST P$IBAD
TRO R10,P$I$AE!P$I$CT
JRST P$ICHE
P$ISD1: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$EP
JRST P$IBAD
TLNN FLAG,PATHFR
JRST .+3
TRNE R10,P$I$SE
JRST P$IBAD
TROE R10,P$I$DE
JRST P$IBAD
TRZ R10,P$I$SE
JRST P$ICHE
P$ISD2: TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE
TRO R10,P$I$DE!P$I$EP
JRST P$ICHE
P$ISVS: TLNN FLAG,PATHAV
JRST P$IBAD
TLNN FLAG,PATHFR
JRST P$IBAD
JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE!P$I$VP
JRST P$IBAD
TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
TRZ R10,P$I$SE!P$I$EP
TRO R10,P$I$VP!P$I$DE
JRST P$ICHE
P$ISVN: CAIL IO,"0"
CAILE IO,"9"
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IBAD
TRZ R10,P$I$DE
JRST P$ICHE
P$ISS: TLNN FLAG,PATHAS
JRST P$IBAD
TRNE R10,P$I$SE
JRST P$IST
TRZN R10,P$I$AE!P$I$DE
JUMPN UTIL,P$IBAD
TRO R10,P$I$SE
JRST P$ICHE
P$IST: TLNE FLAG,PATHFR
JRST P$IBAD
TRNE R10,P$I$EP!P$I$VP
JRST P$IBAD
TRO R10,P$I$TE
JRST P$ICHE
P$IPON: TLNN FLAG,PATHNR!PATHNP
JRST P$IBAD
TRNE R10,P$I$AE!P$I$DE!P$I$SE
JRST P$IBAD
MOVEI X1,1(UTIL)
CAIL X1,(R11)
JRST P$IBAD
IDPB IO,BP
TBOUT <IO>
MOVEI X1,"P"-100
IDPB X1,BP
ADDI UTIL,2
TRO R10,P$I$PW
JRST P$ICHR
P$IPOF: MOVEI X1,1(UTIL)
CAIL X1,(R11)
JRST P$IBAD
MOVEI X1,"P"-100
IDPB X1,BP
IDPB IO,BP
TBOUT <IO>
ADDI UTIL,2
TRZ R10,P$I$PW
TRO R10,P$I$DE
JRST P$ICHR
P$IBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST P$ICHR
P$IREP: TSOUT <CRLF>
TSOUT <(FLAG)>
JUMPE R12,P$IR04
HLR R13,R12
HRLI R13,(POINT 7,)
TRZ R10,P$I$PW
P$IR01: ILDB IO,R13
JUMPE IO,P$IR03
CAIN IO,"P"-100
JRST P$IR02
TRNE R10,P$I$PW
JRST P$IR01
TBOUT <IO>
JRST P$IR01
P$IR02: TRC R10,P$I$PW
JRST P$IR01
P$IR03: TSOUT <(R12)>
P$IR04: HRRZI IO,(BP)
HLR R13,R11
CAIGE IO,(R13)
JRST P$ICHR
HRLI R13,(POINT 7,)
TRZ R10,P$I$PW
P$IR05: CAMN R13,BP
JRST P$ICHR
ILDB IO,R13
CAIN IO,"P"-100
JRST P$IR06
TRNE R10,P$I$PW
JRST P$IR05
TBOUT <IO>
JRST P$IR05
P$IR06: TRC R10,P$I$PW
JRST P$IR05
P$IDEL: JUMPE UTIL,P$IBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
ADD BP,[70000,,0]
TLNE BP,400000
SUB BP,[430000,,1]
CAIN IO,"P"-100
JRST P$ID01
LDB X1,BP
CAIN X1,"P"-100
JRST P$ID02
TRNE R10,P$I$PW
SOJA UTIL,P$ICHR
TBOUT <IO>
TRZ R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
CAIN IO,"."
TRZ R10,P$I$EP
CAIN IO,";"
TRZ R10,P$I$VP
CAIE IO,"<"
JRST P$ID00
TRZE R10,P$I$CT
JRST P$ID00
TRZE R10,P$I$CA
JRST P$ID00
TRZ R10,P$I$CC
P$ID00: SUBI UTIL,1
JUMPE UTIL,P$ICHR
LDB X1,BP
CAIN X1,"<"
TRO R10,P$I$AE
CAIN X1,">"
TRO R10,P$I$DE
CAIN X1,"."
TRO R10,P$I$DE
CAIN X1,";"
TRO R10,P$I$DE
CAIN X1,"*"
TRO R10,P$I$SE
JRST P$ICHR
P$ID01: TRZ R10,P$I$PW
LDB IO,BP
JRST P$ID03
P$ID02: TROE R10,P$I$PW
SOJA UTIL,P$ICHR
TRZ R10,P$I$DE
P$ID03: ADD BP,[70000,,0]
TLNE BP,400000
SUB BP,[430000,,1]
TBOUT <IO>
SUBI UTIL,2
JRST P$ICHR
P$IENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IO,
SETZ UTIL,
RETURN
P$IEND: CAIN IO,12
JRST P$IENL
CAIN IO,37
JRST P$IENL
TLNN FLAG,PATHAS
JRST P$IENV
JUMPE UTIL,P$IENV
LDB R13,BP
CAIN R13,">"
JRST P$IENT
TLNN FLAG,PATHFR
JRST P$IENV
TLNE FLAG,PATHAS
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
JRST P$IENV
P$IENL: TLNN FLAG,PATHFR
JRST P$IENV
TRNE R10,P$I$AE
JRST P$IBAD
P$IENV: TRNN R10,P$I$DE
JRST .+3
TRNN R10,P$I$EP
JRST P$IBAD
; (((TENEX)))
IFG F.TENX,<
TLNN FLAG,PATHFR
JRST P$IE$5
TLNN FLAG,PATHLR!PATHRL
JRST P$IE$5
JUMPN UTIL,P$IE$5
CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST P$IBAD ; PUT -- SECOND ARGUMENT
MOVEI X1,76
PBOUT
TLNE FLAG,PATHLR
HRLZI X1,160103 ; OLD,MSG,CONFIRM,JFN,SHORT
TLNE FLAG,PATHRL
HRLZI X1,660043 ; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
MOVE X2,[100,,101]
GTJFN
JRST P$IENR
MOVE X4,X1
HRRZI X1,(X4)
DVCHR
TLNN X2,000777
JRST P$IE$1
HRROI X1,[ASCIZ/ (Device must be disk)
/]
PSOUT
HRRZI X1,(X4)
RLJFN
JRST .+1
SETO IO,
SETZ UTIL,
RETURN
P$IE$1: MOVE X1,X4
MOVEM X1,LJFN
HRROI X1,LFILE
MOVE X2,LJFN
SETZ X3,
JFNS
MOVEI X1,100
BKJFN
THUD
PBIN
MOVEI IO,(X1)
CAILE R12,-1 ; GET SECOND ARGUMENT
JRST P$IE$2
TLNN FLAG,PATHLR ; PUT FIRST ARGUMENT
JRST .+5
CAIN IO,33
JRST P$IE$2
CAIN IO," "
JRST P$IE$2
HLRO X1,R11
MOVE X2,LJFN
MOVE X3,[002200,,000001]
JFNS
LDB X2,X1
CAIE X2,"."
JRST P$IE$2
SETZ X2,
DPB X2,X1
P$IE$2: HRROI X1,FSBUF
MOVE X2,LJFN
HRLZI X3,002000
JFNS
LDB X1,[350700,,FSBUF]
CAIN X1,"*"
SETOM FSBUF
HRROI X1,ESBUF
HRLZI X3,000200
JFNS
LDB X1,[350700,,ESBUF]
CAIN X1,"*"
SETOM ESBUF
CAIN X1,0
SETZM ESBUF
TLNN X2,017000
JRST P$IE$3
TLNE X2,010000
SETOM VSBUF
TLNE X2,007000
SETZM VSBUF
JRST P$IE$4
P$IE$3: HRROI X1,UBUF1
HRLZI X3,000020
JFNS
HRROI X1,UBUF1
MOVEI X3,↑D10
NIN
SETZ X2,
MOVEM X2,VSBUF
P$IE$4: HRRZ X1,LJFN
RLJFN
THUD
MOVEI UTIL,-1(R11)
CAIN IO,12
SETOM LJFN
CAIN IO,37
SETOM LJFN
RETURN SKIP,1
P$IE$5: CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST .+3
SETZM LFILE
SETZM LJFN
>
; (((↑↑↑)))
JUMPN UTIL,P$IENN
TLNN FLAG,PATHAS
JRST P$IENC
MOVE R12,[POINT 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
JRST P$IENS
P$IENC: TLNN FLAG,PATHAD
JRST P$IBAD
MOVE R12,[POINT 7,[ASCIZ/<</]]
TLNE FLAG,PATHCC
HRRI R12,[ASCIZ/</]
JRST P$IENS
P$IENN: TLNN FLAG,PATHAS
JRST P$IENZ
TRNE R10,P$I$EP!P$I$VP
JRST P$IENZ
TLNN FLAG,PATHFR
JRST .+3
TRNN R10,P$I$AE!P$I$DE
JRST P$IENZ
CAIN IO,12
JRST P$IENZ
CAIN IO,37
JRST P$IENZ
LDB R13,BP
CAIN R13,"<"
JRST P$IENT
MOVEI R13,">"
IDPB R13,BP
TBOUT <R13>
ADDI UTIL,1
P$IENT: MOVE R12,[POINT 7,[ASCIZ/**/]]
TLNN FLAG,PATHFR
JRST P$IENS
HRRI R12,[ASCIZ/*.*/]
TLNE FLAG,PATHAV
HRRI R12,[ASCIZ/*.*;*/]
P$IENS: ILDB R13,R12
IDPB R13,BP
JUMPE R13,RETN(1)
TBOUT <R13>
AOJA UTIL,P$IENS
P$IENZ: SETZ R13,
IDPB R13,BP
ENDR SKIP,1
; P$PP -- PROCESS PATH (NODES AND FILES)
; IN: IO -- SOURCE,,NODE DESTINATION
; UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
; FLAG -- PATH CONTEXT FLAGS
; OUT: FLAG -- FOUND FLAGS
; UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP: BEGINR <BP>
TLNE FLAG,PATHNR
JRST P$PN
HLR BP,IO
HRLI BP,(POINT 7,)
TLNN FLAG,PATHNP
JRST P$PF0
SETZM (IO)
MOVE X1,BP
MOVE X2,BP
P$PS1: ILDB X3,BP
CAIN X3,"<"
JRST P$PS2
CAIN X3,">"
JRST P$PS2
CAIN X3,"."
JRST P$PS3
CAIN X3,";"
JRST P$PS3
JUMPE X3,P$PS3
JRST P$PS1
P$PS2: MOVE X2,BP
JRST P$PS1
P$PS3: MOVE BP,X2
CAMN BP,X1
JRST P$PF
TLO FLAG,PATHNF
MOVE X1,BP
LDB X2,X1
CAIN X2,"<"
ILDB X2,X1
SETZ X3,
DPB X3,X1
PUSH STAK,X1
PUSH STAK,X2
CALLR P$CP
POP STAK,X2
POP STAK,X1
DPB X2,X1
JRST P$PF
P$PN: TLO FLAG,PATHNF
CALLR P$CP
RETURN
P$PF: SKIPE (IO)
JRST P$PF0
MOVE X1,[POINT 7,CONTEX]
MOVE X2,[POINT 7,NBUF]
SCOPY (X1,X2)
P$PF0: TLO FLAG,PATHFF
SETZM (UTIL)
HLR X1,UTIL
HRLI X1,(POINT 7,)
P$PF1: ILDB X2,BP
; (((TENEX)))
IFG F.TENX,<
CAIE X2,"V"-100
JRST .+4
ILDB X2,BP
IDPB X2,X1
JRST P$PF1
>
; (((↑↑↑)))
IDPB X2,X1
JUMPE X2,P$PF3
CAIN X2,";"
JRST P$PF4
CAIE X2,"."
JRST P$PF1
SETZ X2,
DPB X2,X1
HRRI X1,(UTIL)
HRLI X1,(POINT 7,)
P$PF2: ILDB X2,BP
; (((TENEX)))
IFG F.TENX,<
CAIE X2,"V"-100
JRST .+4
ILDB X2,BP
IDPB X2,X1
JRST P$PF2
>
; (((↑↑↑)))
IDPB X2,X1
CAIN X2,";"
JRST P$PF4
JUMPN X2,P$PF2
P$PF3: SETZ UTIL,
RETURN
P$PF4: SETZ X2,
DPB X2,X1
ILDB X2,BP
CAIE X2,"*"
JRST P$PF5
SETO UTIL,
RETURN
P$PF5: SETZ UTIL,
P$PF6: SUBI X2,"0"
IMULI UTIL,↑D10
ADDI UTIL,(X2)
ILDB X2,BP
JUMPN X2,P$PF6
ENDR
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
; IN: IO -- SOURCE,,DESTINATION
; FLAG -- PATH CONTEXT FLAGS
;
P$CP: BEGINR <IO,FLAG>
MOVEI X1,<<LBSIZE*5>-1>
HLR X2,IO
HRLI X2,350700
HRRI X3,(IO)
HRLI X3,(POINT 7,)
LDB IO,X2
CAIN IO,"<"
JRST P$CPCX
TLNE FLAG,PATHCT
JRST P$CPCT
TLNE FLAG,PATHCA
JRST P$CPCA
JRST P$CPCC
P$CPCX: ILDB IO,X2
CAIE IO,"<"
JRST P$CPCC
ILDB IO,X2
CAIE IO,"<"
JRST P$CPCA
ILDB IO,X2
P$CPCT: MOVE X4,[POINT 7,[ASCIZ/%TOP./]]
SCOPY (X4,X3)
MOVE X4,[POINT 7,ANCHOR]
SCOPY (X4,X3)
SUBI X1,11
JRST P$CPCE
P$CPCA: MOVE X4,[POINT 7,[ASCIZ/%LOGIN/]]
SCOPY (X4,X3)
SUBI X1,6
JRST P$CPCE
P$CPCC: MOVE X4,[POINT 7,CONTEX]
ILDB 0,X4
JUMPE 0,.+4
SOJL X1,P$CPE
IDPB 0,X3
JRST .-4
MOVE X4,X3
IDPB 0,X4
P$CPCE: JUMPE IO,P$CPZ0
MOVEI X4,"."
IDPB X4,X3
SUBI X1,1
MOVEI X4,42
SETZ FLAG,
JRST P$CPI0
P$CPI: ILDB IO,X2
P$CPI0: CAIN IO,"P"-100
JRST P$CPI
CAIN IO,">"
JRST P$CPS
JUMPE IO,P$CPZ
JUMPN FLAG,P$CPO
CAIN IO,":"
JRST P$CPP
CAIN IO,"*"
JRST P$CPO
CAIGE IO,"A"
JRST P$CPQ
CAILE IO,"Z"
JRST P$CPQ
P$CPO: SOJL X1,P$CPE
IDPB IO,X3
JRST P$CPI
P$CPQ: SOJL X1,P$CPE
IDPB X4,X3
JRST P$CPO
P$CPS: JUMPE FLAG,.+6
MOVEI IO,"'"
IDPB IO,X3
MOVEI IO,")"
IDPB IO,R3
SETZ FLAG,
MOVEI IO,"."
JRST P$CPO
P$CPP: SUBI X1,4
JUMPL X1,P$CPE
MOVEI IO,"("
IDPB IO,R3
MOVEI IO,"'"
IDPB IO,R3
SETO FLAG,
JRST P$CPI
P$CPE: TSOUT <[ASCIZ/ (Pathname too long)/],CRLF>
MOVE STAK,[IOWD STSIZ,STBEG]
JRST CMDCMD
P$CPZ: JUMPE FLAG,.+5
MOVEI X1,"'"
IDPB X1,X3
MOVEI X1,")"
IDPB X1,X3
P$CPZ0: IDPB IO,X3
ENDR
; LOCAL FILE NAME PREPARATION
; IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF: BEGINR <IO>
; (((TENEX)))
IFG F.TENX,<
SKIPE LFILE
RETURN
>
; (((↑↑↑)))
HLL X1,IO
HRRI X1,FSBUF
BLT X1,<FSBUF+SBSIZE-1>
LDB X1,[350700,,FSBUF]
CAIN X1,"*"
SETOM FSBUF
HRLI X1,(IO)
HRRI X1,ESBUF
BLT X1,<ESBUF+SBSIZE-1>
LDB X1,[350700,,ESBUF]
CAIN X1,"*"
SETOM ESBUF
CAIN X1,0
SETZM ESBUF
HLR X1,IO
HRLI X1,(POINT 7,)
MOVE X2,[POINT 7,ABUF]
ILDB X3,X1
IDPB X3,X2
JUMPN X3,.-2
SKIPN (IO)
JRST .+8
MOVEI X3,"."
DPB X3,X2
HRRI X1,(IO)
HRLI X1,(POINT 7,)
ILDB X3,X1
IDPB X3,X2
JUMPN X3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
HRRZI IO,ABUF
CALLR LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEM UTIL,VSBUF
JUMPE UTIL,P$LFX1
MOVEI X3,";"
DPB X3,X2
JUMPG UTIL,P$LFX0
MOVEI X3,"*"
IDPB X3,X2
SETZ X3,
IDPB X3,X2
JRST P$LFX1
P$LFX0: MOVE X1,X2
MOVE X2,UTIL
MOVEI X3,↑D10
NOUT
THUD
P$LFX1: MOVE IO,[ABUF,,LFILE]
BLT IO,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
ENDR
; ***DATACOMPUTER INTERFACE ROUTINES***
; DALO -- ALLOCATE SPACE
;
DALO: BEGINR
DCSOUT <[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
MOVE IO,ABUF
DCNOUT <IO>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DATT -- LOGIN TO NODE
;
DATT: BEGINR
DCSOUT <[ASCIZ/LOGIN /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[ASCII/%LOGI/]
MOVEM X1,CONTEX
MOVE X1,[ASCII/N/]
MOVEM X1,<CONTEX+1>
SKIPN OPENED
RETURN
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA: BEGINR <IO,UTIL>
DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCHAD: DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST DCHAD
TSOUT <[ASCIZ/ [Ok]/],CRLF>
DCHAI: TAIN <[ASCIZ/ Add a new privilege? /]>
RETURN
RETURN
SETZM ABUF ; WRITE FLAG
SETZM <ABUF+1> ; HOST
SETZM <ABUF+2> ; SOCKET
SETOM <ABUF+3> ; PASSWORD
TAIN <[ASCIZ/ Allow control? /]>
JRST DCHAI
SETOM ABUF
TAIN <[ASCIZ/ Restrict via network? /]>
JRST DCHAI
JRST DCHAI5
TAIN <[ASCIZ/ Restrict via local host? /]>
JRST DCHAI
JRST DCHAI1
MOVE IO,LHOST
JRST DCHAI2
DCHAI1: TSOUT <[ASCIZ/ Host number (octal): /]>
TNIN ([ASCIZ/ Host number (octal): /],10)
JRST DCHAI
TSOUT <CRLF>
DCHAI2: MOVEM IO,<ABUF+1>
TAIN <[ASCIZ/ Restrict via user? /]>
JRST DCHAI
JRST DCHAI5
MOVE IO,LHOST
CAMN IO,<ABUF+1>
JRST DCHAI3
TSOUT <[ASCIZ/ Socket number (octal): /]>
TNIN ([ASCIZ/ Socket number (octal): /],10)
JRST DCHAI
JRST DCHAI4
DCHAI3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
TSOUT <[ASCIZ/ User: /]>
TNIN ([ASCIZ/ User: /],10)
JRST DCHAI
LSH IO,11
ADDI IO,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
TSOUT <[ASCIZ/ User: /]>
TSIN (UBUF1,LBSIZE,[ASCIZ/ User: /])
JRST DCHAI
SETZ X1,
MOVE X2,[POINT 7,UBUF1]
STDIR
JRST .+3
JRST .+2
JRST .+4
HRROI X1,[ASCIZ/ (User not found)
/]
PSOUT
JRST DCHAI
HRRZI IO,(X1)
LSH IO,↑D15
ADDI IO,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
JRST DCHAI5>
DCHAI4: MOVEM IO,<ABUF+2>
TSOUT <CRLF>
DCHAI5: TAIN <[ASCIZ/ Restrict via password? /]>
JRST DCHAI
JRST DCHAC
TSOUT <[ASCIZ/ Password: /]>
TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/ Password: /])
JRST DCHAI
TSOUT <CRLF>
DCHAC: DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
SKIPE ABUF
JRST DCHAC1
DCSOUT <[ASCIZ/CWA/]>
DCHAC1: SKIPN <ABUF+1>
JRST DCHAC3
DCSOUT <<[ASCIZ/,H=/]>>
MOVE IO,<ABUF+1>
DCNOUT <IO>
DCSOUT <<[ASCIZ/,S=/]>>
MOVE IO,<ABUF+2>
JUMPE IO,DCHAC2
DCNOUT <IO>
JRST DCHAC3
DCHAC2: DCSOUT <[ASCIZ/ANY/]>
DCHAC3: SETO IO,
CAMN IO,<ABUF+3>
JRST DCHAC4
DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4: DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ/ [OK]/],CRLF>
JRST DCHAI
ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON: BEGINR
DCSOUT <[ASCIZ/LIST /],NBUF,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DCON1
TSOUT <[ASCIZ/ [Old Node]/],CRLF>
JRST DCON2
DCON1: TAIN <[ASCIZ/ [New Node][Confirm]/]>
RETURN
RETURN
DCSOUT <[ASCIZ/CREATE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCON2: MOVE X1,[POINT 7,NBUF]
MOVE X2,[POINT 7,CONTEX]
SCOPY (X1,X2)
ENDR
; DCRE -- CREATE NEW NODE
;
DCRE: BEGINR
DCSOUT <[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
MOVEI IO,DEFALO
DCNOUT <IO>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
CALLR DCHA
ENDR
; DDEL -- DELETE FILES
;
DDEL: BEGINR <IO>
SETZ IO,
CALLR D$OPEN
RETURN
SETO IO,
CALLR D$VER
RETURN
SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE DELETED INTEGER
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DELETED=0
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ UPDATE FILES IN "<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <[ASCIZ/
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ STATUS='D'
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DELETED=DELETED+1
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ COMMENT FILES.FILE.HEADER.FILENAME
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ ! ';' ! FILES.FILE.HEADER.VERSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ END
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END;
/]>
CALLR RENDER
RETURN
ENDR
; DDIR -- FILE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
SETO IO,
CALLR D$OPEN
RETURN
SKIPN VBUF
SETOM VBUF
SETZ UTIL,
CAIN FLAG,DD$T
JRST DDIRO1
CAIN FLAG,DD$V
JRST DDIRO2
RETURN
DDIRO1: DCSOUT <[ASCIZ/"<TERSE">="<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
JRST DDIRO3
DDIRO2: DCSOUT <[ASCIZ/"<VERBOSE">="<FILES">/]>
SETZ IO,
DDIRO3: CALLR D$WITH
DCSOUT <SEMI>
MOVE IO,[ASCII/.I241/]
CALLR RENFIP
RETURN
CALLR RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF: CALLR RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF: SKIPN FLAGCO
JRST DDIRF0
HRROI X1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE X1,DCOJFN
MOVEI X2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF0: CALLR RENPRE
>
; (((↑↑↑)))
CAMN IO,[ASCII/ /]
JRST DDIRF1
CAMN IO,[ASCII/.I261/]
JRST DDIRF2
CALLR RENLIP
SETZM FLAGDE
CALLR RENDER
RETURN
RETURN
DDIRF1: CALLR <(FLAG)>
AOJA UTIL,DDIRF
DDIRF2: CALLR RENLIN
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN UTIL,RETN(0)
TSOUT <[ASCIZ/ [No Files]/],CRLF>
ENDR
; DD$T -- TERSE FILES
;
DD$T: BEGINR <IO>
SKIPE FLAGDD
JRST DD$T1
MOVEI IO,11
TBOUT <IO>
DD$T1: DCBIN <IO>
SKIPE FLAGDD
JRST DD$T2
TBOUT <IO>
DD$T2: CAIE IO,12
JRST DD$T1
ENDR
; DD$V -- VERBOSE FILES
;
DD$V: BEGINR <IO>
SKIPE FLAGDD
JRST DD$V1
MOVEI IO,11
TBOUT <IO>
DD$V1: DCBIN <IO>
SKIPE FLAGDD
JRST DD$V3
CAIN IO,11
JRST DD$V2
TBOUT <IO>
JRST DD$V3
DD$V2: TSOUT <CRLF>
TBOUT <IO>
TBOUT <IO>
JRST DD$V1
DD$V3: CAIE IO,12
JRST DD$V1
ENDR
; DEXP -- EXPUNGE
;
DEXP: BEGINR <IO>
SKIPN OPENED
JRST DEXP1
SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DEXP1: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
CALLR RENPRE
CALLR RENLIN
CAMN IO,[ASCII/.I280/]
JRST DEXP2
TSOUT <[ASCIZ/ (There are no <FILES>)/],CRLF>
RETURN
DEXP2: DCBIN <IO>
CAIN IO," "
JRST DEXP3
CAIE IO,12
JRST DEXP2
DCBIN <IO>
CAIN IO," "
JRST DEXP3
CALLR RENLIN
RETURN
DEXP3: DCBIN <IO>
CAIE IO,"R"
JRST DEXP2
DCBIN <IO>
CAIE IO,"E"
JRST DEXP2
DCBIN <IO>
CAIE IO,"C"
JRST DEXP2
DCBIN <IO>
CAIE IO,"S"
JRST DEXP2
DCBIN <IO>
CAIE IO,"="
JRST DEXP2
CALLR DCNIN
CALLR RENLIN
SETZM FLAGDE
CALLR RENDER
JRST .+1
JUMPN IO,DEXP4
DCSOUT <[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DEXP4: SETZ IO,
CALLR D$OPEN
RETURN
DCSOUT <[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
ENDR
; DGET -- GET-RETRIEVE
;
DGET: BEGINR <IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME X2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
SETZ FLAG,
SETO IO,
CALLR D$OPEN
RETURN
SKIPLE VBUF
JRST DGET1
MOVEI IO," "
CALLR D$VER
RETURN
JRST DGET2
DGET1: SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE EXTANT INT
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ EXTANT=0
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ FOR "<FILES">
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (VERSION EQ /]>
MOVE IO,VBUF
DCNOUT <IO>
DCSOUT <[ASCIZ/)
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (STATUS EQ ' ')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ EXTANT=EXTANT+1
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END/],SEMI>
CALLR RENDER
RETURN
DGET2: DCSOUT <[ASCIZ/"<GET">="<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
CALLR D$WITH
DCSOUT <SEMI>
CALLR NETOI
THUD
MOVE IO,[ASCII/;I249/]
CALLR RENFIP
RETURN
CALLR RENLIN
SKIPE FLAGNN
JRST DGET$
TSOUT <[ASCIZ/ [Ok]/],CRLF>
DGET$: SETZM NSUM
DGET3: CALLR GETFIL
JRST DGET4 ; EXIT RETRIEVAL LOOP ON NETWORK EOF
CALLR LOCNFO
SETZM FLAGFE
CALLR LOCOO
SETOM FLAGFE
CALLR GETDAT
CALLR LOCC
SKIPE FLAGTT
CALLR NETRAT
AOJA FLAG,DGET3
DGET4: CALLR NETC
MOVE IO,[ASCII/;I269/]
CALLR RENFIP
JRST DGETE
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
JUMPN FLAG,RETN(1)
TSOUT <[ASCIZ/ (No Such File)/],CRLF>
RETURN SKIP,1
DGETE: CALLR D$CON
ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
GET$F==SBSIZE ; FILENAME
GET$E==SBSIZE ; EXTENSION
GET$D==4 ; DATE
; DLIN -- DATACOMPUTER LINK
;
DLIN: BEGINR <IO,UTIL,FLAG>
MOVE FLAG,FLAGDD
DLINI: TSOUT (<[BYTE (7)76,0,0,0,0]>)
TSIN (ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
JRST DLINI
JUMPE UTIL,DLINE
TSOUT <CRLF>
SETZM FLAGDD
DCSOUT <ABUF,CRLF>
SETOM FLAGDD
CALLR RENDER
JRST DLINI
JRST DLINI
DLINE: TSOUT <[ASCIZ/[Returning]/],CRLF>
MOVEM FLAG,FLAGDD
ENDR
; DLIS -- NODE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS: BEGINR <IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
CAIN FLAG,DL$T
JRST DLISO1
CAIN FLAG,DL$V
JRST DLISO2
CAIN FLAG,DL$P
JRST DLISO3
RETURN
DLISO1: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
JRST DLISI
DLISO2: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
JRST DLISI
DLISO3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI: SETZ UTIL,
SETZM GBUF1
MOVE X1,[GBUF1,,GBUF1+1]
BLT X1,<GBUF1+LBSIZE-1>
MOVEI X1,<GBUF2+1>
MOVEM X1,GBUF2
CALLR RENPRE
CAMN IO,[ASCII/.I280/]
JRST DLISD
CALLR RENLIP
JRST DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN: DCBIN <IO>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN: SKIPN FLAGCO
JRST DLISN0
HRROI X1,[ASCIZ/ [Aborting]
/]
PSOUT
MOVE X1,DCOJFN
MOVEI X2,22
MTOPR
SETZM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
JRST DLISER
DLISN0: DCBIN <IO>
>
; (((↑↑↑)))
CAIE IO," "
JRST DLISE
SETO UTIL,
SKIPE FLAGDD
JRST DLISD
CALLR <(FLAG)>
JRST DLISN
DLISD: CALLR RENLIN
JRST DLISN
DLISE: CAIN IO,"?"
JRST DEATH
CALLR RENLIN
JUMPN UTIL,DLISER
TSOUT <[ASCIZ/ [No Nodes]/],CRLF>
DLISER: SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; DL$T -- TERSE NODES
;
DL$T: BEGINR
CALLR DL$NAM
JRST DL$T0
TSOUT <CRLF>
DL$T0: CALLR RENLIN
ENDR
; DL$V -- VERBOSE NODES
;
DL$V: BEGINR <IO,UTIL,FLAG>
DL$VN: DCBIN <IO>
CAIE IO,"="
JRST DL$VN
CALLR DL$NAM
JRST DL$VE
TSOUT <CRLF>
MOVEI UTIL,GBUF1
SKIPE (UTIL)
AOJA UTIL,.-1
SUBI UTIL,GBUF1
DL$VF: DCBIN <IO>
CAIE IO,"="
JRST DL$VF
DCBIN <IO>
SETZ FLAG,
CAIN IO,"F"
MOVEI FLAG,5
CAIN IO,"P"
MOVEI FLAG,1
CAIN IO,"N"
MOVEI FLAG,3
JUMPE FLAG,DL$VE
CALLR RENLIN
DL$VD: MOVEI IO,(UTIL)
DL$VD0: TSOUT <[ASCIZ/ /]>
SOJGE IO,DL$VD0
MOVEI IO,"]"
TBOUT <IO>
DL$VD1: DCBIN <IO>
TBOUT <IO>
CAIE IO,12
JRST DL$VD1
SOJG FLAG,DL$VD
RETURN
DL$VE: CALLR RENLIN
ENDR
; DL$P -- PROTECTION
;
DL$P: BEGINR <IO>
CALLR DL$NAM
JRST DL$P1
TSOUT <CRLF>
CALLR RENLIN
RETURN
DL$P1: MOVEI IO,GBUF1
DL$P2: SKIPE (IO)
AOJA IO,DL$P2
SUBI IO,GBUF1
DL$P3: TSOUT <[ASCIZ/ /]>
SOJGE IO,DL$P3
MOVEI IO,"]"
TBOUT <IO>
DL$P4: DCBIN <IO>
TBOUT <IO>
CAIE IO,12
JRST DL$P4
ENDR
; DL$NAM -- DIRECTORY: NAME OUTPUT
; OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM: BEGINR <BP,UTIL,FLAG,R10>
SETZ R10,
SETZ FLAG,
MOVE BP,[POINT 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DCBIN <IO>
CAILE IO," "
JRST DL$NA1
RETURN
DL$NAN: DCBIN <IO>
DL$NA1: CAIN IO,"."
JRST DL$NIN
CAIG IO," "
JRST DL$NA3
CAIE IO,42
JRST DL$NA2
DCBIN <IO>
DL$NA2: IDPB IO,BP
SOJG UTIL,DL$NAN
JRST DL$NER
DL$NA3: SETZ X1,
IDPB X1,BP
TSOUT <[ASCIZ/ /],ABUF>
RETURN SKIP,1
DL$NIN: MOVE BP,[POINT 7,ABUF]
MOVEI UTIL,<SBSIZE*5>
DL$NI1: DCBIN <IO>
CAIN IO,"."
JRST DL$NCN
CAIG IO," "
JRST DL$NCN
DL$NI2: CAIE IO,42
JRST DL$NI3
DCBIN <IO>
DL$NI3: IDPB IO,BP
SOJG UTIL,DL$NI1
JRST DL$NER
DL$NCN: SETZ X1,
IDPB X1,BP
SKIPN X2,GBUF1(FLAG)
JRST DL$NON
HRLI X2,(POINT 7,)
MOVE X1,[POINT 7,ABUF]
DL$NC1: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST DL$NON
JUMPN X3,DL$NC1
CAIG IO," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NON: CAIL FLAG,LBSIZE-2
JRST DL$NER
SETZM GBUF1+1(FLAG)
HRL X1,GBUF1+1(FLAG)
HRR X1,GBUF1+2(FLAG)
BLT X1,<GBUF1+LBSIZE-1>
MOVE X1,[POINT 7,ABUF]
SKIPN X2,GBUF1(FLAG)
HRR X2,GBUF2
HRLI X2,(POINT 7,)
HRRZI BP,(BP)
SUBI BP,<ABUF-1>
ADDI BP,(X2)
CAIL BP,<GBUF2+LBSIZE>
JRST DL$NER
HRRZM X2,GBUF1(FLAG)
DL$NO1: ILDB X3,X1
IDPB X3,X2
JUMPN X3,DL$NO1
HRRZI X2,1(X2)
MOVEM X2,GBUF2
MOVEI UTIL,(FLAG)
JUMPE R10,DL$NO2
TSOUT <CRLF>
DL$NO2: TSOUT <[ASCIZ/ /]>
SOJGE UTIL,DL$NO2
TSOUT <ABUF>
SETO R10,
CAIG IO," "
RETURN SKIP,1
AOJA FLAG,DL$NIN
DL$NER: TSOUT <[ASCIZ/ (Pathname too long)/],CRLF>
ENDR
; DPUT -- PUT-STORE
;
DPUT: BEGINR <IO>
; (((TENEX)))
IFG F.TENX,<
GJINF
CAME X2,LDIR
CALLR D$CON
>
; (((↑↑↑)))
CALLR LOCFFI
RETURN
SKIPN OPENED
JRST DPUT3
MOVE X1,[440700,,OPENED]
MOVE X2,[440700,,NBUF]
DPUT1: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST DPUT2
JUMPN X3,DPUT1
MOVEI X1,1
CAMN X1,OPENEM
JRST DPUT5
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI X1,1
MOVEM X1,OPENEM
JRST DPUT5
DPUT2: SETZM OPENED
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
DPUT3: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST DPUT4
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[440700,,NBUF]
MOVE X2,[440700,,OPENED]
SCOPY (X1,X2)
MOVEI X1,1
MOVEM X1,OPENEM
JRST DPUT5
DPUT4: DCSOUT <[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
SKIPE FLAGNN
JRST DPUT$1
TSOUT <[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1: MOVE X1,[440700,,NBUF]
MOVE X2,[440700,,OPENED]
SCOPY (X1,X2)
SETZM OPENEM
DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
MOVEI X1,1
MOVEM X1,OPENEM
SETZM VBUF
JRST DPUT6
DPUT5: SETZM VBUF
SETZ IO,
CALLR D$VER
RETURN
DPUT6: AOS VBUF
DCSOUT <[ASCIZ/"<FILES">="<PUT">/],SEMI>
CALLR NETOO
THUD
MOVE IO,[ASCII/;I239/]
CALLR RENFIP
RETURN
CALLR RENLIN
SKIPE FLAGNN
JRST DPUT$2
TSOUT <[ASCIZ/ [Ok]/],CRLF>
DPUT$2: SETZM NSUM
CALLR LOCOI
THUD
CALLR NETFFI
DPUT7: CALLR PUTFIL
CALLR PUTDAT
SKIPE FLAGTT
CALLR NETRAT
CALLR LOCNFI
JRST DPUT7
CALLR NETC
MOVE IO,[ASCII/;I259/]
CALLR RENFIP
JRST DPUTE
CALLR RENLIN
CALLR NETSUM
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN SKIP,1
DPUTE: CALLR D$CON
ENDR
; DREM -- DELETE NODES
;
DREM: BEGINR
DCSOUT <[ASCIZ/DELETE /],NBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
DCSOUT <[ASCIZ/LIST /],CONTEX,SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
RETURN
TSOUT <[ASCIZ/ [Connected To Attached Node]/],CRLF>
MOVE X1,[ASCII/%LOGI/]
MOVEM X1,CONTEX
MOVE X1,[ASCII/N/]
MOVEM X1,<CONTEX+1>
ENDR
; DUND -- UNDELETE
;
DUND: BEGINR <IO>
SETZ IO,
CALLR D$OPEN
RETURN
MOVEI IO,"D"
CALLR D$VER
RETURN
SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE UNDELETED INTEGER
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ UNDELETED=0
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ UPDATE FILES IN "<FILES">/]>
HRRZI IO,[ASCIZ/ STATUS EQ 'D'/]
CALLR D$WITH
DCSOUT <[ASCIZ/
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ STATUS=' '
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ UNDELETED=UNDELETED+1
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ COMMENT FILES.FILE.HEADER.FILENAME
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ ! ';' ! FILES.FILE.HEADER.VERSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ END
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END;
/]>
CALLR RENDER
RETURN
ENDR
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT: BEGINR <IO,BP,UTIL,FLAG>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$IN0
TSOUT <[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
JRST QUIT
D$IN0: TSOUT <[ASCIZ/ [Attaching]/],CRLF>
HRRZI UTIL,HOSTS
D$IN1: SKIPN (UTIL)
JRST D$IND
HLRZ X1,(UTIL)
CAME X1,LHOST
AOJA UTIL,D$IN1
MOVE IO,[POINT 7,[ASCIZ/%TOP.DFTP./]]
MOVE BP,[POINT 7,ABUF]
SCOPY (IO,BP)
HRR IO,(UTIL)
HRLI IO,(POINT 7,)
SCOPY (IO,BP)
MOVEI IO,"."
IDPB IO,BP
; (((ITS)))
IFL F.TENX,<
.SUSET [.RXUNAME,,UBUF1]
SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
HRROI X1,31
HRROI X2,32
GETTAB X1,
THUD
GETTAB X2,
THUD
MOVEM X1,UBUF1
MOVEM X2,<UBUF1+1>
SETZM <UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
GETPPN X1,
JFCL
TRNN X1,770000
JRST [ LSH X1,↑D6
JRST .-1] ; Left Justify SAIL PN's
HRLZM X1,UBUF1
SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
MOVE X1,[POINT 6,UBUF1]
MOVEI X2,42
ILDB X3,X1
JUMPE X3,.+7
ADDI X3,40
CAIL X3,"A"
CAILE X3,"Z"
IDPB X2,BP
IDPB X3,BP
JRST .-7
MOVE X1,BP
IDPB X3,X1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
GJINF
CAMN X1,X2
JRST .+10
HRROI X1,[ASCIZ/ (from /]
PSOUT
MOVEI X1,101
DIRST
THUD
HRROI X1,[ASCIZ/)
/]
PSOUT
HRROI X1,UBUF1
DIRST
THUD
MOVE X1,[POINT 7,UBUF1]
MOVEI X2,42
ILDB X3,X1
JUMPE X3,.+6
CAIL X3,"A"
CAILE X3,"Z"
IDPB X2,BP
IDPB X3,BP
JRST .-6
MOVE X1,BP
IDPB X3,X1
>
; (((↑↑↑)))
DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
CALLR RENPRE
CALLR RENLIN
SETZM FLAGDE
CALLR RENDER
JRST .+1
CAMN IO,[ASCII/;O032/]
JRST D$INP
CAME IO,[ASCII/+U107/]
JRST D$IND
MOVEI FLAG,3
D$IN2: TSOUT <[ASCIZ/ [Password:/]>
TSIN (UBUF1,LBSIZE,<[ASCIZ/ [Password:/]>,NOECHO)
JRST D$IN2
TSOUT <[ASCIZ/]/],CRLF>
MOVE X2,BP
MOVEI X1,"("
IDPB X1,X2
MOVEI X1,"'"
IDPB X1,X2
MOVE X1,[440700,,UBUF1]
SCOPY (X1,X2)
MOVEI X1,"'"
IDPB X1,X2
MOVEI X1,")"
IDPB X1,X2
SETZ X1,
IDPB X1,X2
DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
TSOUT <[ASCIZ/ (Incorrect password)/],CRLF>
SOJG FLAG,D$IN2
TSOUT <[ASCIZ/ [Attaching]/],CRLF>
D$IND: MOVE X1,[POINT 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
MOVE X2,[POINT 7,ABUF]
SCOPY (X1,X2)
DCSOUT <[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
TSOUT <[ASCIZ/ (as DFTP.GUEST)/],CRLF>
D$INP: DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE UTIL,[ASCII/%LOGI/]
MOVEM UTIL,CONTEX
MOVE UTIL,[ASCII/N/]
MOVEM UTIL,<CONTEX+1>
SETZM OPENED
CALLR D$CON
ENDR
; D$CON -- CONNECT
;
D$CON: BEGINR <UTIL>
CALLR NETDSI
DCSOUT <[ASCIZ/CONNECT "<GET"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
CALLR NETDSO
DCSOUT <[ASCIZ/CONNECT "<PUT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
; (((TENEX)))
IFG F.TENX,<
GJINF
MOVEM X2,LDIR
>
; (((↑↑↑)))
ENDR
; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
; IN: IO -- MODE FLAG
; READ IF < 0
; WRITE IF = 0
; APPEND IF > 0
;
D$OPEN: BEGINR
SKIPN OPENED
JRST D$OP05
MOVE X1,[POINT 7,OPENED]
MOVE X2,[POINT 7,NBUF]
D$OP01: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST D$OP05
JUMPN X3,D$OP01
CAMN IO,OPENEM
RETURN SKIP,1
JUMPE IO,D$OP02
JUMPG IO,D$OP03
DCSOUT <[ASCIZ/MODE "<FILES"> READ/],SEMI>
JRST D$OP04
D$OP02: DCSOUT <[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
JRST D$OP04
D$OP03: DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04: SETOM FLAGDE
CALLR RENDER
RETURN
MOVEM IO,OPENEM
RETURN SKIP,1
D$OP05: DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$OP06
TSOUT <[ASCIZ/ (There are no <FILES>)/],CRLF>
RETURN
D$OP06: SKIPN OPENED
JRST D$OP07
DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
SETZM FLAGDE
CALLR RENDER
JRST .+1
SETZM OPENED
D$OP07: JUMPE IO,D$OP08
JUMPG IO,D$OP09
DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
JRST D$OP10
D$OP08: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
JRST D$OP10
D$OP09: DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10: SETOM FLAGDE
CALLR RENDER
RETURN
MOVE X1,[POINT 7,NBUF]
MOVE X2,[POINT 7,OPENED]
SCOPY (X1,X2)
MOVEM IO,OPENEM
ENDR SKIP,1
; D$VER -- PRODUCE PROPER VERSION NUMBER
; IN: IO -- DEFAULT FLAG
; SMALLEST UNDELETED VERSION IF < 0
; LARGEST VERSION IF = 0
; LARGEST DELETED VERSION IF = "D"
; LARGEST UNDELETED VERSION IF = " "
; OUT: IO -- VERSION (IF DEFAULT)
;
D$VER: BEGINR <UTIL>
SKIPE VBUF
RETURN SKIP,1
JUMPE IO,D$VER1
LDB UTIL,[350700,,FBUF]
CAIN UTIL,"*"
SETOM VBUF
LDB UTIL,[350700,,EBUF]
CAIN UTIL,"*"
SETOM VBUF
SKIPE VBUF
RETURN SKIP,1
JUMPG IO,D$VER2
SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE LEAST INT
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ LEAST=-1
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ FOR "<FILES">
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (STATUS EQ ' ')/],[ASCIZ/
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF LEAST GT VERSION THEN LEAST=VERSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ END
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ COMMENT '}' ! LEAST
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END/],SEMI>
JRST D$VERE
D$VER1: SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE GREATEST INT
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ GREATEST=0
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ FOR "<FILES">/]>
CALLR D$WITH
DCSOUT <[ASCIZ/
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ END
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ COMMENT '}' ! GREATEST
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END/],SEMI>
JRST D$VERE
D$VER2: SETOM FLAGDE
DCSOUT <[ASCIZ/BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ DECLARE GREATEST INT
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ GREATEST=-1
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ FOR "<FILES">
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ AND (STATUS EQ '/]>
DCBOUT <IO>
SKIPN FLAGDD
JRST D$VER$
TBOUT <IO>
D$VER$: DCSOUT <[ASCIZ/')
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ BEGIN
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ END
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/ COMMENT '}' ! GREATEST
/]>
CALLR RENDER
RETURN
DCSOUT <[ASCIZ/END/],SEMI>
D$VERE: MOVE IO,[ASCII/;A282/]
CALLR RENFIP
RETURN
D$VERN: DCBIN <IO>
CAIE IO,"}"
JRST D$VERN
CALLR DCNIN
MOVEM IO,VBUF
CALLR RENLIN
CALLR RENDER
RETURN
ENDR SKIP,1
; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
; IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
; FLAGS:
D$W$F==400000
D$W$E==200000
D$W$V==100000
D$W$Q==010000
;
D$WITH: BEGINR <UTIL,FLAG>
SETZ FLAG,
LDB UTIL,[350700,,FBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$F
LDB UTIL,[350700,,EBUF]
CAIE UTIL,"*"
TRO FLAG,D$W$E
SKIPLE VBUF
TRO FLAG,D$W$V
SKIPE IO
TRO FLAG,D$W$Q
JUMPE FLAG,RETN(0)
DCSOUT <[ASCIZ/ WITH/]>
TRNN FLAG,D$W$F
JRST D$WIT1
DCSOUT <[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$E!D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT1: TRNN FLAG,D$W$E
JRST D$WIT2
DCSOUT <[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
TRNN FLAG,D$W$V!D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT2: TRNN FLAG,D$W$V
JRST D$WIT3
DCSOUT <[ASCIZ/ VERSION EQ /]>
MOVE UTIL,VBUF
DCNOUT <UTIL>
TRNN FLAG,D$W$Q
RETURN
DCSOUT <[ASCIZ/ AND/]>
D$WIT3: TRNN FLAG,D$W$Q
RETURN
DCSOUT <(IO)>
ENDR
; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM: BEGINR <IO,FLAG>
CALLR RENPRE
CAME IO,[ASCII/;I275/]
JRST NETS2
SETZ FLAG,
NETS1: DCBIN <IO>
CAIE IO,"="
JRST NETS1
SKIPN FLAG
SOJA FLAG,NETS1
CALLR DCNIN
CAME IO,NSUM
JRST NETS3
CALLR RENLIN
RETURN
NETS2: CALLR RENLIP
RETURN
NETS3: CALLR RENLIN
TSOUT <[ASCIZ/ (Network Checksum Error)/],CRLF>
ENDR
; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT: BEGINR <IO,<IO+1>>
TSOUT <[ASCIZ/ (/]>
MOVEI IO,↑D36
IMULB IO,NSIZE
IDIV IO,NTIME
TNOUT <IO>
TSOUT <[ASCIZ/ Baud (/]>
MOVE IO,NSIZE
TNOUT <IO>
TSOUT <[ASCIZ/ bits in /]>
MOVE IO,NTIME
CAIN IO,0
MOVEI IO,1
TNOUT <IO>
HRRZI <IO+1>,[ASCIZ/ seconds))/]
CAIN IO,1
HRRZI <IO+1>,[ASCIZ/ second))/]
TSOUT <(IO+1),CRLF>
ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER: BEGINR <IO,UTIL,FLAG>
SETZ FLAG,
RENDSL: CALLR RENPRE
CAMN IO,[ASCII/.I220/]
JRST RENDES
CAMN IO,[ASCII/.I210/]
JRST RENDRR
CAMN IO,[ASCII/;A282/]
JRST RENDPM
CAMN IO,[ASCII/.J151/]
JRST RENDPM
LDB UTIL,[350700,,IO]
CAIN UTIL,"+"
JRST RENDMM
CAIN UTIL,"-"
JRST RENDMM
JRST RENDFL
RENDMM: SETO FLAG,
SKIPN FLAGDE
JRST RENDFL
SETZM FLAGDE
RENDPM: CALLR RENLIP
JRST RENDSL
RENDFL: CALLR RENLIN
JRST RENDSL
RENDES: CALLR RENLIN
MOVEI IO,"L"-100
DCBOUT <IO>
SETO FLAG,
JRST RENDSL
RENDRR: CALLR RENLIN
JUMPN FLAG,RETN(0)
ENDR SKIP,1
; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
; IN: IO -- PREFIX
;
RENFIP: BEGINR <BP,UTIL,FLAG>
MOVE FLAG,IO
SETZ UTIL,
RENFIL: CALLR RENPRE
CAMN IO,FLAG
RETURN SKIP,1
LDB BP,[350700,,IO]
CAIN BP,";"
JRST RENFIN
CAIN BP,"."
JRST RENFIN
SKIPN UTIL
CALLR RENLIP
SKIPE UTIL
CALLR RENLIN
AOJA UTIL,RENFIL
RENFIN: CALLR RENLIN
CAMN IO,[ASCII/.I220/]
JRST RENFIS
CAMN IO,[ASCII/.I210/]
RETURN
JRST RENFIL
RENFIS: MOVEI IO,"L"-100
DCBOUT <IO>
SETZM FLAGDE
CALLR RENDER
RETURN
ENDR
; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN: BEGINR <IO>
RENLNL: DCBIN <IO>
CAIE IO,12
JRST RENLNL
ENDR
; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP: BEGINR <IO>
SKIPN FLAGDD
JRST RENLPF
RENLPL: DCBIN <IO>
CAIE IO,12
JRST RENLPL
RETURN
RENLPF: DCBIN <IO>
CAIN IO,12
RETURN
CAIE IO,11
JRST RENLPF
MOVEI IO," "
TBOUT <IO>
MOVEI IO,"("
RENLPP: TBOUT <IO>
RENLPQ: DCBIN <IO>
CAIN IO,42
JRST RENLPQ
CAIE IO,15
JRST RENLPP
DCBIN <IO>
MOVEI IO,")"
TBOUT <IO>
TSOUT <CRLF>
ENDR
; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
; OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE: BEGINR <BP,UTIL,FLAG>
RENPRP: SETZ IO,
MOVE BP,[POINT 7,IO]
MOVEI FLAG,5
RENPRL: DCBIN <UTIL>
CAIN UTIL,15
JRST RENPRL
CAIN UTIL,12
JRST RENPRL
IDPB UTIL,BP
SOJG FLAG,RENPRL
LDB UTIL,[350700,,IO]
CAIN UTIL,"?"
JRST DEATH
CAIE UTIL,"!"
RETURN
SKIPN FLAGNN
CALLR RENLIP
JRST RENPRP
ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH: CALLR RENLIP
TSOUT <[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
.VALUE
.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
HALTF
JRST .-1
>
; (((↑↑↑)))
; ***I/O ROUTINES***
; TAIN -- TERMINAL AUTHORIZATION INPUT
; IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$: BEGINR <IO>
MOVEI IO,(X1)
TSOUT <(IO)>
TAIN1: TBIN <IO>
CAIN IO,15
JRST TAIN1
CAIN IO,"R"-100
JRST TAIN1
CAIN IO,"N"
JRST TAIN2
CAIN IO,"Y"
JRST TAIN3
CAIN IO,12
JRST TAIN4
CAIN IO,33
JRST TAIN4
CAIN IO,37
JRST TAIN4
CAIN IO," "
JRST TAIN4
TSOUT <[ASCIZ/XXX/],CRLF>
RETURN
TAIN2: TSOUT <[ASCIZ/No/],CRLF>
RETURN SKIP,1
TAIN3: TSOUT <[ASCIZ/Yes/]>
TAIN4: TSOUT <CRLF>
ENDR SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
; WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
; INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
; IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
; LINE FEED, EOL, OR SPACE WILL FINISH IT.
; IF NOT, SUCH CHARACTERS WILL BE REJECTED.
; ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
; ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
; IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
; POINTER TO COMMAND STRING LIST
; NUMBER OF COMMANDS
; NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
; NUMBER OF WORDS IN LARGEST COMMAND STRING
; <VALUE LIST>
; <COMMAND STRING LIST>
; OUT: TCIO -- LAST CHAR INPUT
; FLAG -- COMMAND VALUE
; RETURNS: SKIP,0 -- DELETE LINE
; SKIP,1 -- NULL COMMAND
; SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$: BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
MOVE TCIACB,TCIO
SETZ UTIL,
TCII01: MOVEM UTIL,TCIPCL(UTIL)
ADDI UTIL,1
CAME UTIL,1(TCIACB)
JRST TCII01
ADDI UTIL,TCIPCL
MOVEM UTIL,TCIPNF
HRRI UTIL,TCIPCL
HRL UTIL,1(TCIACB)
MOVEM UTIL,TCIPLP
MOVE TCIBP,[POINT 7,ABUF]
HRLI TCISBP,350700
HRR TCISBP,(TCIACB)
SETZ TCISCC,
TCICHR: TBIN <TCIO>
CAIN TCIO,"R"-100
JRST TCIREP
CAIN TCIO,"?"
JRST TCIQUA
CAIN TCIO,"A"-100
JRST TCIDEL
CAIN TCIO,"U"-100
JRST TCIENR
CAIN TCIO,"X"-100
JRST TCIENR
CAIN TCIO,177
IFE F.TENX,< JRST TCIDEL>
IFN F.TENX,< JRST TCIENR>
CAIN TCIO,15
JRST TCICHR
CAIN TCIO,12
JRST TCIC01
CAIN TCIO,37
JRST TCIC01
CAIN TCIO," "
JRST TCIC01
CAIN TCIO,33
JRST TCIC01
CAIG TCIO," "
JRST TCIBAD
JRST TCIC02
TCIC01: JUMPE TCISCC,TCIENN
HLRZ UTIL,TCIPLP(TCISCC)
CAIN UTIL,1 ; OK IF JUST ONE POSSIBILITY
JRST TCIEND
TCIC02: SETZ TCIPCC,
MOVE TCIPBP,TCISBP
MOVE UTIL,TCIPNF
MOVEM UTIL,<TCIPLP+1>(TCISCC)
SETZ TCIMAC,
HRRZI TCIMAN,-1
TCIC03: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC04
CAIE UTIL,(TCIO)
JRST TCIC08
TCIC04: HLRZ TCITCC,TCIPLP(TCISCC)
HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05: MOVE UTIL,(TCITLP)
CAIN UTIL,(TCIPCC)
JRST TCIC06
AOJ TCITLP,
SOJG TCITCC,TCIC05
JRST TCIC08
TCIC06: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC07
AOJ TCIMAC,
MOVEM TCIPCC,@TCIPNF
AOS TCIPNF
JRST TCIC08
TCIC07: CAIN TCIMAN,-1
SETO TCIMAN,
CAIE TCIMAN,-1
HRRZI TCIMAN,(TCIPCC)
TCIC08: ADD TCIPBP,3(TCIACB)
AOJ TCIPCC,
CAME TCIPCC,1(TCIACB)
JRST TCIC03
CAIN TCIO,12
JRST TCIC09
CAIN TCIO,37
JRST TCIC09
CAIN TCIO," "
JRST TCIC09
CAIE TCIO,33
JRST TCIC10
TCIC09: JUMPL TCIMAN,TCIBAD
CAIN TCIMAN,-1
JRST TCIBAD
JRST TCIEND
TCIC10: JUMPE TCIMAC,TCIBAD
AOJ TCISCC,
HRLM TCIMAC,TCIPLP(TCISCC)
IBP TCISBP
IDPB TCIO,TCIBP
TBOUT <TCIO> ; ECHO
JRST TCICHR
TCIBAD: MOVEI TCIO,"G"-100
TBOUT <TCIO>
JRST TCICHR
TCIREP: TSOUT <CRLF>
HLRZ UTIL,TCIACB
TSOUT <(UTIL)>
HRRZI TCIPCC,(TCISCC) ; OUTPUT LOOP CONTROL = CHARS SO FAR
MOVE TCIPBP,[POINT 7,ABUF]
TCIR01: SOJL TCIPCC,TCICHR
ILDB TCIO,TCIPBP
TBOUT <TCIO>
JRST TCIR01
TCIQUA: TBOUT <TCIO> ; PRINT "?"
HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01: TSOUT <CRLF>
MOVEI TCIO,11
TBOUT <TCIO>
MOVE TCITCC,2(TCIACB)
MOVE TCITLP,(TCIPBP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(POINT 7,)
TCIQ02: ILDB TCIO,TCITLP
JUMPE TCIO,TCIQ03
TBOUT <TCIO>
SOJG TCITCC,TCIQ02
TCIQ03: AOJ TCIPBP,
SOJG TCIPCC,TCIQ01
JRST TCIREP
TCIDEL: JUMPLE TCISCC,TCIBAD ; THERE'S NO CHARACTER TO DELETE
MOVEI TCIO,"\"
TBOUT <TCIO>
LDB TCIO,TCIBP
TBOUT <TCIO>
ADD TCIBP,[70000,,0] ; FIX LINE BYTE PTR
TLNE TCIBP,400000
SUB TCIBP,[430000,,1]
HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
MOVEM UTIL,TCIPNF
ADD TCISBP,[70000,,0] ; FIX SCAN BYTE PTR
TLNE TCISBP,400000
SUB TCISBP,[430000,,1]
SOJA TCISCC,TCICHR
TCIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ FLAG,
RETURN
TCIENN: SETZ FLAG,
RETURN SKIP,1
TCIEND: MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
MOVE TCITLP,(TCITLP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,(POINT 7,)
SETZ TCITCC,
TCIE01: IBP TCITLP
AOJ TCITCC,
CAIE TCITCC,(TCISCC)
JRST TCIE01
TCIE02: AOJ TCITCC,
CAMLE TCITCC,2(TCIACB)
JRST TCIE03
ILDB TCIMAC,TCITLP
JUMPE TCIMAC,TCIE03
TBOUT <TCIMAC>
JRST TCIE02
TCIE03: MOVE TCITLP,TCIPLP(TCISCC)
MOVE FLAG,(TCITLP)
ADDI FLAG,4(TCIACB)
MOVE FLAG,(FLAG)
ENDR SKIP,2
; TERMINAL STRING INPUT
; IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
; UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
; OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
; UTIL -- COUNT OF CHARACTERS
;
$TSIN$: BEGINR <BP,R10,R11,R12>
MOVE R10,IO
MOVE R11,UTIL
HLR BP,IO
HRLI BP,(POINT 7,)
SETZ UTIL,
TSICHR: TBIN <IO>
CAIN IO,"R"-100
JRST TSIREP
CAIN IO,"A"-100
JRST TSIDEL
CAIN IO,"U"-100
JRST TSIENR
CAIN IO,"X"-100
JRST TSIENR
CAIN IO,177
IFE F.TENX,< JRST TSIDEL>
IFN F.TENX,< JRST TSIENR>
CAIN IO,15
JRST TSICHR
CAIN IO,12
JRST TSIEND
CAIN IO,33
JRST TSIEND
CAIN IO,37
JRST TSIEND
CAIGE IO," "
JRST TSIBAD
CAIL UTIL,(R10)
JRST TSIBAD
IDPB IO,BP
ADDI UTIL,1
JUMPL R11,TSICHR
TBOUT <IO>
JRST TSICHR
TSIBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST TSICHR
TSIREP: TSOUT <CRLF>
TSOUT <(R11)>
JUMPL R11,TSICHR
HRRZI IO,(BP)
HLR R12,R10
CAIGE IO,(R12)
JRST TSICHR
HRLI R12,(POINT 7,)
TSIR01: CAMN R12,BP
JRST TSICHR
ILDB IO,R12
TBOUT <IO>
JRST TSIR01
TSIDEL: JUMPE UTIL,TSIBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
ADD BP,[70000,,0]
TLNE BP,400000
SUB BP,[430000,,1]
SUBI UTIL,1
JUMPL R11,TSICHR
TBOUT <IO>
JRST TSICHR
TSIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETO IO,
SETZ UTIL,
RETURN
TSIEND: SETZ R12,
IDPB R12,BP
ENDR SKIP,1
; TERMINAL NUMBER INPUT
; IN: IO -- POINTER TO ↑R TEXT,,RADIX
; OUT: IO -- NUMBER
;
$TNIN$: BEGINR <BP,UTIL,FLAG>
MOVE UTIL,IO
MOVE BP,[POINT 7,UBUF1]
SETZ FLAG,
TNICHR: TBIN <IO>
CAIN IO,"R"-100
JRST TNIREP
CAIN IO,"A"-100
JRST TNIDEL
CAIN IO,"U"-100
JRST TNIENR
CAIN IO,"X"-100
JRST TNIENR
CAIN IO,177
IFE F.TENX,< JRST TNIDEL>
IFN F.TENX,< JRST TNIENR>
CAIN IO,15
JRST TNICHR
CAIN IO,12
JRST TNIEND
CAIN IO,33
JRST TNIEND
CAIN IO,37
JRST TNIEND
CAIN IO," "
JRST TNIEND
CAIGE IO,"0"
JRST TNIBAD
CAIL IO,"0"(UTIL)
JRST TNIBAD
CAILE FLAG,12 ; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
JRST TNIBAD
IDPB IO,BP
TBOUT <IO>
AOJA FLAG,TNICHR
TNIBAD: MOVEI IO,"G"-100
TBOUT <IO>
JRST TNICHR
TNIREP: TSOUT <CRLF>
HLRZ IO,UTIL
TSOUT <(IO)>
HRRZI IO,(BP)
CAIGE IO,UBUF1
JRST TNICHR
MOVE IO,[POINT 7,UBUF1]
TNIR01: CAMN IO,BP
JRST TNICHR
ILDB X1,IO
TBOUT <X1>
JRST TNIR01
TNIDEL: JUMPE FLAG,TNIBAD
MOVEI IO,"\"
TBOUT <IO>
LDB IO,BP
ADD BP,[70000,,0]
TLNE BP,400000
SUB BP,[430000,,1]
TBOUT <IO>
SOJA FLAG,TNICHR
TNIENR: TSOUT <[ASCIZ/XXX/],CRLF>
SETZ IO,
RETURN
TNIEND: SETZ IO,
IDPB IO,BP
MOVE BP,[POINT 7,UBUF1]
MOVEI FLAG,(UTIL)
TNICAL: ILDB UTIL,BP
JUMPE UTIL,RETN(1)
IMULI IO,(FLAG)
SUBI UTIL,"0"
ADDI IO,(UTIL)
JRST TNICAL
ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
; OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN: BEGINR <<IO+1>,UTIL>
SETZ IO,
DCNIN1: DCBIN <UTIL>
CAIGE UTIL,"0"
RETURN
CAILE UTIL,"9"
RETURN
JUMPL IO,DCNIN2
MULI IO,↑D10
CAILE IO,1
JRST DCNIN2
CAIN IO,1
TLO <IO+1>,400000
MOVE IO,<IO+1>
ADDI IO,-"0"(UTIL)
JRST DCNIN1
DCNIN2: SETO IO,
JRST DCNIN1
ENDR
; $NOUT$ -- INTEGER OUTPUT
; IN: X1 -- INTEGER
; X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$: BEGINR <FLAG>
MOVE FLAG,X2
MOVE X3,[POINT 7,UBUF1]
MOVEI X4,1
JUMPGE X1,NOUT1
LSHC X1,-↑D35
LSH X2,-1
DIVI X1,(FLAG)
JRST .+2
NOUT1: IDIVI X1,(FLAG)
ADDI X2,60
IDPB X2,X3
SKIPE X1
AOJA X4,NOUT1
MOVE X1,[POINT 7,UBUF2]
NOUT2: LDB X2,X3
IDPB X2,X1
SOJ X3,
IBP X3
IBP X3
IBP X3
IBP X3
SOJG X4,NOUT2
IDPB X4,X1
SKIPL FLAG
JRST NOUT3
DCSOUT <UBUF2>
RETURN
NOUT3: TSOUT <UBUF2>
ENDR
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
.OPEN TTI,[.UAI,,'TTY'] ; TTY input
THUD
.CALL [ SETZ
SIXBIT/TTYGET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVEM ; first set of character groups
MOVEM ; second set of character groups
SETZM X1] ; TTYSTS variable
THUD
TLO X1,200 ; disable **MORE** processing
MOVE [030303,,030303] ; turn off echoing
.CALL [ SETZ
SIXBIT/TTYSET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVE ; first set of character groups
MOVE ; second set of character groups
SETZ X1] ; TTYSTS variable
THUD
.OPEN TTO,[.UAO,,'TTY'] ; TTY output
THUD
.CALL [ SETZ ; host number
SIXBIT/NETHST/
MOVEI -1
MOVEM
SETZM LHOST]
THUD
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UII!40050 ; OPEN on gensymmed socket, 32 bits
MOVEI ICP
[('NET')] ; network device
[-1] ; initial local socket is gensymmed
MOVEI DCSOKT ; initial foreign socket(DATACOMPUTER)
SETZI DCHOST] ; foreign host(CCA)
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI ICP
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
MOVE X1,[ICP,,RCHBLK]
.RCHST X1, ; get status of network channel
HRRE X1,RCHBLK+4 ; get status of network
JUMPL X1,NETDED ; network dead if .LE. 0
CAIN X1,%NSCLI ; CLS w/ input?
JRST ICPWIN
CAIE X1,%NSINP ; input available?
CAIN X1,%NSOPN ; connection open?
JRST ICPWIN
JUMPN X1,[THUD] ; any other condition is lossage
ICPCLS: TSOUT <[ASCIZ/Cannot establish network connection/]>
.BREAK 16,160000
NETDED: TSOUT <[ASCIZ/ARPAnet is down/]>
.BREAK 16,160000
ICPWIN: MOVE X1,RCHBLK+1 ; get gensymmed local socket
ADDI X1,2 ; receive
MOVEM X1,LCLRCV
ADDI X1,1 ; transmit
MOVEM X1,LCLTRN
.IOT ICP,X1 ; get foreign place's socket
.CLOSE ICP, ; free up ICP socket right away
MOVEM X1,FORRCV ; receive
ADDI X1,1 ; socket to me!
MOVEM X1,FORTRN
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAI
MOVEI DCI ; DATACOMPUTER input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAO
MOVEI DCO ; DATACOMPUTER output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCI
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCO
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
MOVEI X1,2 ; offset for data sockets
ADDM X1,LCLRCV
ADDM X1,LCLTRN
ADDM X1,FORRCV
ADDM X1,FORTRN
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: .IOT DCO,["Z"-100] ; SEND QUIT
QUIT1: DCBIN <IO>
JRST QUIT1
QUIT2: .CLOSE DCI,
.CLOSE DCO,
.BREAK 16,160000
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI DDI ; DATACOMPUTER data input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDI
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
RETURN SKIP,1
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI DDO ; DATACOMPUTER data output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDO
MOVEI %NSRFS
SETZM X1] ; wait for connection
THUD
JUMPE X1,ICPCLS
RETURN SKIP,1
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
.CLOSE DDI,
.CLOSE DDO,
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI: BEGINR
MOVE UTIL,LCLRCV
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO: BEGINR
MOVE UTIL,LCLTRN
ENDR
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOI1
RETURN SKIP,1
LOCOI1: TSOUT <[ASCIZ/ (Local file not found)/],CRLF>
ENDR
;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI LCO
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
THUD
.CALL [ SETZ
SIXBIT/SFDATE/
MOVEI LCO
SETZ LCLDAT]
THUD
RETURN SKIP,1
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
.CLOSE LCI,
.CLOSE LCO,
ENDR
; LOCS -- LOCAL FILE (SIZE)
;
LOCS: BEGINR
.CALL [ SETZ
SIXBIT/FILLEN/
MOVEI LCI
SETZM IO]
SETZ IO, ; it should not crap out
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IO -- ADDRESS OF TIME STRING
; OUT: UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN: BEGINR <BP>
SETZ UTIL,
ILDB X1,IO
CAIL X1,"0"
CAILE X1,"9"
RETURN
SUBI X1,"0"
IMULI X1,↑D10
ILDB X2,IO
CAIL X2,"0"
CAILE X2,"9"
RETURN
ADDI X1,-"0"(X2)
ILDB X2,IO
CAIE X2,"-"
RETURN
MOVE X2,[POINT 7,X3]
SETZ X3,
REPEAT 3,<
ILDB X4,IO
IDPB X4,X2
>
MOVEI X2,↑D12
CAMN X3,LUTTM-1(X2)
JRST .+3
SOJGE X2,.-2
RETURN
ILDB X3,IO
CAIE X3,"-"
RETURN
ILDB X3,IO
CAIL X3,"0"
CAILE X3,"9"
RETURN
SUBI X3,"0"
IMULI X3,↑D10
ILDB X4,IO
CAIL X4,"0"
CAILE X4,"9"
RETURN
ADDI X3,-"0"(X4)
DPB X3,[POINT 7,UTIL,8]
DPB X2,[POINT 4,UTIL,12]
DPB X1,[POINT 5,UTIL,17]
ILDB X1,IO
CAIE X1," "
RETURN
ILDB X1,IO
SUBI X1,"0"
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,6
ILDB X2,IO
CAIE X2,":"
RETURN
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,6
ILDB X2,IO
CAIE X2,":"
JRST [ IMULI X1,↑D20
JRST LUTSN1]
ILDB X2,IO
ADDI X1,-"0"(X2)
IMULI X1,↑D10
ILDB X2,IO
ADDI X1,-"0"(X2)
LSH X1,1
LUTSN1: ADDI UTIL,(X1)
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: UTIL -- ITS DISK FORMAT DATE/TIME
; BP -- BYTE POINTER TO DESTINATION STRING
; OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
LDB X3,[POINT 5,UTIL,17] ; DAY
IDIVI X3,↑D10
ADDI X3,"0"
ADDI X4,"0"
IDPB X3,BP
IDPB X4,BP
MOVEI X3,"-"
IDPB X3,BP
LDB X3,[POINT 4,UTIL,12] ; MONTH
HRRI X3,LUTTM-1(X3)
HRLI X3,(POINT 7,)
SCOPY (X3,BP)
MOVEI X3,"-"
IDPB X3,BP
LDB X3,[POINT 7,UTIL,8] ; YEAR
IDIVI X3,↑D10
ADDI X3,"0"
ADDI X4,"0"
IDPB X3,BP
IDPB X4,BP
MOVEI X3," "
IDPB X3,BP
LDB X2,[POINT 17,UTIL,34] ; TIME IN SECONDS
IDIVI X2,↑D3600
MOVEI X4,(X3)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
MOVEI X2,":"
IDPB X2,BP
MOVEI X2,(X4)
IDIVI X2,↑D60
MOVEI X4,(X3)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
MOVEI X2,":"
IDPB X2,BP
MOVEI X2,(X4)
IDIVI X2,↑D10
ADDI X2,"0"
ADDI X3,"0"
IDPB X2,BP
IDPB X3,BP
SETZ X2,
IDPB X2,BP
ENDR ; return
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII/JAN/
ASCII/FEB/
ASCII/MAR/
ASCII/APR/
ASCII/MAY/
ASCII/JUN/
ASCII/JUL/
ASCII/AUG/
ASCII/SEP/
ASCII/OCT/
ASCII/NOV/
ASCII/DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IO>
SETZM LCLFN1 ; < prevent assembly error
MOVSI X1,'> '
MOVEM X1,LCLFN2
HRLI IO,(POINT 7,)
LUTFN1: CALLR LUTWRD ; get a SIXBIT word
MOVEM X1,LCLFN1
JUMPE X2,RETN(0)
CAIE X2,"."
JRST LUTFN1
CALLR LUTWRD
CAIE X1,
MOVEM X1,LCLFN2 ; use FN2 if specified
ENDR
; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN X1, DELIMITER IN X2
;
LUTWRD: BEGINR <BP>
SETZ X1, ; initialize word, word pointer
MOVE BP,[POINT 6,X1]
LUTWR1: ILDB X2,IO ; get a character from buffer
CAIN X2,"."
JRST RETN(0)
JUMPE X2,RETN(0)
SUBI X2," " ; SIXBITify from ASCII
TRNN X1,77 ; and save in word until word filled
IDPB X2,BP
JRST LUTWR1
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETZM FFITYP
SETO X1,
CAME X1,FSBUF
CAMN X1,ESBUF
CAIA
JRST NETFI1
.IOT TTO,[" "]
.IOT TTO,["("]
SETOM FFITYP
NETFI1: MOVE X1,[POINT 6,LCLFN1]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
JUMPE X4,.+4
ADDI X4," "
SKIPE FFITYP
.IOT TTO,X4
SKIPE GBUF1
IDPB X4,X3
SOJG X2,.-7
NETFI2: SKIPE FFITYP
.IOT TTO,["."]
MOVE X1,[POINT 6,LCLFN2]
MOVEI X2,6
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
JUMPE X4,.+4
ADDI X4," "
SKIPE FFITYP
.IOT TTO,X4
SKIPE GBUF2
IDPB X4,X3
SOJG X2,.-7
NETFI3: SKIPN FFITYP
RETURN
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IO,BP,UTIL>
SETZM IOBUFR
MOVE X1,[IOBUFR,,IOBUFR+1]
BLT X1,IOBUFR+1777
.RDTIM X1,
IDIVI X1,↑D30
MOVEM X1,NTIME
MOVE BP,[POINT 7,IOBUFR]
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
.CALL [ SETZ
SIXBIT/RFDATE/
MOVEI LCI
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
.CALL [ SETZ
SIXBIT/RQDATE/
SETZM UTIL]
MOVSI UTIL,124201
CALLR LUTTNS
HRLI BP,004400
MOVE UTIL,VBUF
IDPB UTIL,BP
CALLR LOCS
IDPB IO,BP
MOVNI UTIL,17
IDPB UTIL,BP
HRRZI BP,(BP)
MOVEI X1,(BP)
SUBI BP,IOBUFR-1
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,(X1)
SOJ X1,
SOJG BP,.-2
ADDM UTIL,NSUM
MOVN X1,NSIZE
HRLS X1
HRRI X1,IOBUFR
MOVEM X1,X1SAVE#
CALLR NETMSG
JRST DEATH
MOVE X1,X1SAVE#
.IOT DDO,X1
ENDR
; PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT: BEGINR <UTIL,IO>
CALLR LOCS ; get length of file
AOS NSIZE
ADDM IO,NSUM
ADDM IO,NSIZE
CALLR NETMSG
JRST PUTD4
HRROI X1,IO
.IOT DDO,X1
SETZ UTIL,
PUTD1: MOVE X1,[-2000,,IOBUFR]
.IOT LCI,X1 ; read 1K from local file
JUMPL X1,PUTD2 ; hit EOF here
CALLR NETMSG
JRST PUTD4
MOVE X1,[-2000,,IOBUFR]
.IOT DDO,X1
MOVSI X1,-2000 ; compute checksum
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
JRST PUTD1
PUTD2: MOVEM X1,X1SAVE#
CALLR NETMSG
JRST PUTD4
MOVE X1,X1SAVE#
MOVEI X1,-IOBUFR(X1) ; get # of words transferred
JUMPE X1,PUTD3
MOVNS X1
HRLZS X1
MOVEM X1,X1SAVE#
CALLR NETMSG
JRST PUTD4
HRRI X1,IOBUFR
.IOT DDO,X1
MOVE X1,X1SAVE#
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
PUTD3: ADDM UTIL,NSUM
ADDM UTIL,NSUM
CALLR NETMSG
JRST PUTD4
HRROI X1,UTIL
.IOT DDO,X1
PUTD4: .RDTIM X1,
IDIVI X1,↑D30
SUBM X1,NTIME
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IO,UTIL>
.RDTIM X1,
IDIVI X1,↑D30
MOVEM X1,NTIME
CALLR NETMSG
JRST DEATH
MOVE IO,[-GET$F,,FBUF]
.IOT DDI,IO
JUMPL IO,RETN(0)
MOVEI IO,GET$F
MOVEM IO,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
CALLR NETMSG
JRST DEATH
MOVE IO,[-GET$E,,EBUF]
.IOT DDI,IO
MOVEI IO,GET$E
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
CALLR NETMSG
JRST DEATH
MOVE IO,[-GET$D,,ABUF]
.IOT DDI,IO
MOVEI IO,GET$D
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[POINT 7,ABUF]
CALLR LUTTSN
MOVEM UTIL,LCLDAT
CALLR NETMSG
JRST DEATH
HRROI IO,ABUF
.IOT DDI,IO
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
CALLR NETMSG
JRST DEATH
HRROI IO,ABUF
.IOT DDI,IO
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IO,UTIL,FLAG>
CALLR NETMSG
JRST GETD4
HRROI IO,FLAG
.IOT DDI,IO
JUMPE FLAG,GETD3
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
SETZ UTIL,
GETD1: CAIGE FLAG,2000
JRST GETD2
SUBI FLAG,2000
CALLR NETMSG
JRST GETD4
MOVE X1,[-2000,,IOBUFR]
.IOT DDI,X1 ; read 1K from DATACOMPUTER
MOVE X1,[-2000,,IOBUFR]
.IOT LCO,X1
MOVSI X1,-2000 ; compute checksum
ADD UTIL,IOBUFR(X1)
AOBJN X1,.-1
JRST GETD1
GETD2: JUMPE FLAG,GETD3
MOVN X1,FLAG
HRLZS X1
HRRI X1,IOBUFR
MOVEM X1,X1SAVE#
CALLR NETMSG
JRST GETD4
MOVE X1,X1SAVE#
.IOT DDI,X1
MOVE X1,X1SAVE#
.IOT LCO,X1
MOVE X1,X1SAVE#
ADD UTIL,(X1)
AOBJN X1,.-1
GETD3: ADDM UTIL,NSUM
CALLR NETMSG
JRST GETD4
HRROI IO,ABUF
.IOT DDI,IO
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
CALLR NETMSG
JRST GETD4
HRROI IO,ABUF
.IOT DDI,IO
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
CAMN IO,UTIL
JRST GETD4
TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
GETD4: .RDTIM X1,
IDIVI X1,↑D30
SUBM X1,NTIME
ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG: BEGINR <IO>
NETMS1: .CALL [ SETZ
SIXBIT/WHYINT/
MOVEI DCI
MOVEM IO
MOVEM IO
SETZM IO]
THUD
JUMPE IO,RETN(1)
NETMS2: DCBIN <IO>
CAIN IO,"?"
JRST DEATH
CAIN IO,"!"
JRST NETMS3
CAIE IO,"+"
CAIN IO,"-"
JRST NETMS4
CALLR RENLIN
JRST NETMS1
NETMS3: CALLR RENLIP
JRST NETMS1
NETMS4: CALLR RENLIP
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IO>
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
SETO X1,
CAMN X1,FSBUF
JRST LOCFI0
CAMN X1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: .CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ LCLSNM]
JRST LOCFNF
MOVE X1,[-2000,,DIRBLK]
.IOT X1
.CLOSE
LOCFI1: MOVE IO,DIRBLK+1 ; POINTER TO NAME AREA
ADDI IO,DIRBLK
CAIN IO,DIRBLK+2000 ; END OF DIRECTORY?
JRST LOCFNF
MOVEI X1,5
ADDM X1,DIRBLK+1
SETO X1,
CAME X1,FSBUF
JRST LOCFI2
CAME X1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAMN X4,(IO)
JRST LOCFI4
JRST LOCFI1
LOCFNF: TSOUT <[ASCIZ/ (No Such File)/],CRLF>
RETURN
LOCFI3: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 6,X4]
SETZ X4,
MOVEI X3,6
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAME X4,1(IO)
JRST LOCFI1
LOCFI4: MOVE X1,(IO)
MOVEM X1,LCLFN1
MOVE X1,1(IO)
MOVEM X1,LCLFN2
LOCFI5: CALLR LOCOI
RETURN
.CLOSE
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IO>
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST LOCNI0
CAMN X1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: MOVE IO,DIRBLK+1
ADDI IO,DIRBLK
CAIN IO,DIRBLK+2000
RETURN SKIP,1
MOVEI X1,5
ADDM X1,DIRBLK+1
SETO X1,
CAME X1,FSBUF
JRST LOCNI1
CAME X1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAMN X4,(IO)
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 6,X4]
MOVEI X3,6
SETZ X4,
ILDB X1
CAIN "."
JRST .+5
JUMPE .+4
SUBI " "
IDPB X2
SOJG X3,.-6
CAME X4,1(IO)
JRST LOCNI0
LOCNI3: MOVE X1,(IO)
MOVEM X1,LCLFN1
MOVE X1,1(IO)
MOVEM X1,LCLFN2
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
[('DSK')]
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCNI0
SKIPN GBUF1
JRST LOCNI4
MOVE X1,[POINT 6,LCLFN1]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI4: SKIPN GBUF2
JRST LOCNI5
MOVE X1,[POINT 6,LCLFN2]
MOVEI X2,6
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI5: .IOT TTO,[" "]
.IOT TTO,["("]
TSOUT <FBUF>
.IOT TTO,["."]
TSOUT <EBUF>
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IO>
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,ABUF]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNOO
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNOO: MOVEI IO,ABUF
CALLR LUTFN
.IOT TTO,[" "]
.IOT TTO,["("]
TSOUT ABUF
.IOT TTO,[")"]
.IOT TTO,[15]
.IOT TTO,[12]
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
MOVE 0,[SIXBIT/DSK/]
MOVEM 0,LFCHAS+1
GETPPN 0,
MOVEM 0,LFIPPN
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <IO,UTIL>
MSTIME X1,
IDIVI X1,↑D1000
MOVEM X1,NTIME
MOVE IO,[-GET$F,,FBUF]
CALLR NUTFB
RETURN
MOVEI IO,GET$F
MOVEM IO,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[GET$E,,EBUF]
CALLR NUTFB
MOVEI IO,GET$E
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[GET$D,,ABUF]
CALLR NUTFB
MOVEI IO,GET$D
ADDM IO,NSIZE
SETZ UTIL,
ADD UTIL,<ABUF-1>(IO)
SOJG IO,.-1
ADDM UTIL,NSUM
MOVE IO,[POINT 7,ABUF]
CALLR LUTTSN
DPB IO,[001400,,LFILE+2]
LSH IO,-14
DPB IO,[170300,,LFILE+1]
DPB UTIL,[141300,,LFILE+2]
MOVE IO,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
MOVE IO,[1,,ABUF]
CALLR NUTFB
AOS NSIZE
MOVE X1,ABUF
ADDM X1,NSUM
SKIPLE X1
MOVE X1,LFCHAS
SKIPGE X1
MOVN X1,X1
DPB X1,[270400,,LFILE+2]
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT: BEGINR <IO,UTIL,FLAG>
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE FLAG,ABUF
JUMPE FLAG,GETD2
ADDM FLAG,NSUM
AOS NSIZE
ADDM FLAG,NSIZE
SETZ UTIL,
SKIPE FLAGFE
JRST GETD3
OUT LFCHAN,
JRST .+2
THUD
GETD1:
IFE F.SAIL,<
CALLR NETMSG
JRST GETD3
>
CAIGE FLAG,SIZBLK
HRLI IO,(FLAG)
CAIL FLAG,SIZBLK
HRLI IO,SIZBLK
HRR IO,LFOBUF+1
ADDI IO,1
CALLR NUTFB
CAIGE FLAG,SIZBLK
MOVEI IO,(FLAG)
CAIL FLAG,SIZBLK
MOVEI IO,SIZBLK
SUBI FLAG,(IO)
HRRZ X1,LFOBUF+1
ADDM IO,LFOBUF+1
ADDI X1,(IO)
ADD UTIL,(X1)
SOJ X1,
SOJG IO,.-2
OUT LFCHAN,
JRST .+2
THUD
JUMPG FLAG,GETD1
GETD2: ADDM UTIL,NSUM
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
MOVE IO,[1,,ABUF]
CALLR NUTFB
MOVE IO,ABUF
ADDM IO,NSUM
AOS NSIZE
CAMN IO,UTIL
JRST GETD4
TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
JRST GETD4
IFE F.SAIL,<
GETD3: ADDM UTIL,NSUM
SETZ UTIL,
SKIPE DDIBUF+2
JRST .+6
GETD$: STATZ DDCHAN,020000
JRST GETD4
IN DDCHAN,
JRST .+2
JRST GETD4
HRRZ X1,DDIBUF+1
MOVE X2,DDIBUF+2
ADDI X1,(X2)
ADD UTIL,(X1)
SOJ X1,
SOJG X2,.-2
ADDM UTIL,NSUM
SETZ UTIL,
SETZM DDIBUF+2
JRST GETD$
>
IFN F.SAIL,<
GETD3: IN DDCHAN,
JRST GETD3
>
GETD4: MSTIME X1,
IDIVI X1,↑D1000
MOVE X2,NTIME
SUB X1,X2
MOVEM X1,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <IO,BP,UTIL>
OUT DDCHAN,
JRST .+2
THUD
MSTIME X1,
IDIVI X1,↑D1000
MOVEM X1,NTIME
HRR BP,DDOBUF+1
HRLI BP,010700
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
LDB IO,[001400,,LFILE+2] ; CREATION DATE
LDB UTIL,[170300,,LFILE+1]
LSH UTIL,14
IORI IO,(UTIL)
LDB UTIL,[141300,,LFILE+2] ; CREATION TIME
CALLR LUTTNS
DATE IO,
MSTIME X1,
IDIVI X1,<↑D1000*↑D60>
MOVE UTIL,X1
CALLR LUTTNS
HRLI BP,004400
MOVE UTIL,VBUF
IDPB UTIL,BP
CALLR LOCS
IDPB IO,BP
LDB UTIL,[270400,,LFILE+2] ; DATA MODE
SKIPE UTIL
MOVN UTIL,UTIL
IDPB UTIL,BP
HRRZ IO,DDOBUF+1
MOVEM BP,DDOBUF+1
HRRZI BP,(BP)
HRRZI X1,(BP)
SUBI BP,-1(IO)
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,(X1)
SOJ X1,
SOJG BP,.-2
ADDM UTIL,NSUM
OUT DDCHAN,
JRST .+2
THUD
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IO,UTIL>
CALLR LOCS
AOS NSIZE
ADDM IO,NSUM
ADDM IO,NSIZE
AOS DDOBUF+1
MOVEM IO,@DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
SETZ UTIL,
PUTD1: SOSG LFIBUF+2
IN LFCHAN,
CAIA
JRST PUTD2
ILDB X1,LFIBUF+1
ADD UTIL,X1
IFE F.SAIL,<
SOSLE DDOBUF+2
JRST .+10
CALLR NETMSG
JRST PUTD3
OUT DDCHAN,
JRST .+5
STATZ DDCHAN,400000
STATO DDCHAN,001000
THUD
JRST PUTD3
>
IFN F.SAIL,<
SOSG DDOBUF+2
JRST [ CALLR NETMSG
JRST PUTD3
OUT DDCHAN,
JRST .+1
THUD]
>
IDPB X1,DDOBUF+1
JRST PUTD1
PUTD2: STATO LFCHAN,20000
THUD
AOS NSIZE
ADDM UTIL,NSUM
ADDM UTIL,NSUM
AOS DDOBUF+1
MOVEM UTIL,@DDOBUF+1
IFE F.SAIL,<
OUT DDCHAN,
JRST .+4
STATZ DDCHAN,400000
STATO DDCHAN,001000
THUD
>
IFN F.SAIL,<
OUT DDCHAN,
JRST .+2
THUD
>
PUTD3: MSTIME X1,
IDIVI X1,↑D1000
MOVE X2,NTIME
SUB X1,X2
MOVEM X1,NTIME
ENDR
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IO,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IO,LINP ; LISTEN ON INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IO,DCIBLK+.IBERR
CAIE IO,.IESKT
JRST ICPEIL
MOVE IO,PWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB X4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ X3,
SETZ FLAG,
ICPRDV: MOVE IO,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IO,WRKBLK+.IBDEV
MOVEI X1,(X3)
IDIVI X1,10
JUMPE X1,ICPRD1
ADDI X1,20
ADDI X2,20
DPB X1,[140600,,WRKBLK+.IBDEV]
DPB X2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI X2,20
DPB X2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IO,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IO,DCHOST
JRST ICPRD3
PJOB X1,
HLRZ X2,WRKBLK+.IBSTT ; OWNING JOB
CAIE X2,(X1)
JRST ICPRD3
MOVE IO,WRKBLK+.IBLCL
CAMN IO,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IO,2
CAMN IO,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IO,1 ; OUTPUT DATA SOCKET
MOVEM IO,WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IO,WRKBLK+.IBHST
CAIE IO,DCHOST
JRST ICPRD4
PJOB X1,
HLRZ X2,WRKBLK+.IBSTT
CAIE X2,(X1)
JRST ICPRD4
MOVE IO,WRKBLK+.IBLCL
SUBI IO,3
CAMN IO,UTIL
JRST ICPCLO
ICPRD4: ADDI X3,1
CAIGE X3,(X4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ/ (Connections in use)/]
EXIT
ICPCLS: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IO,1
MOVEM IO,WRKBLK+.IBLCL
MOVE IO,SWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Retrieve interrupted: connection closed)
/]
JRST ICPRDV
ICPCLO: MOVE IO,CWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ/ (Store interrupted: connection closed)
/]
JRST ICPRDV
ICPICP: MOVE IO,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IO,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IO,DCCHAS+1
MOVE IO,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IO,OICP
CALL IO,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IO,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IO,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IO,ICPBUF+1
MOVE IO,1(IO) ; GET THE SOCKET NUMBER
LSH IO,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IO,DCOBLK+.IBRMT
AOJ IO,
MOVEM IO,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IO,OINP ; OPEN INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IO,OOUT ; OPEN OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IO,PWRK
CALL IO,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IO,WRKBLK+.IBHST
MOVEM IO,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK
STLOC==1 ; STATUS BITS RETURNED HERE
LSLOC==2 ; LOCAL SOCKET
WFLOC==3 ; WAIT FLAG
BSLOC==4 ; BYTE SIZE LOCATION
FSLOC==5 ; FOREIGN SOCKET
HLOC==6 ; HOST NUMBER
ERRBTS==763600 ; I/O ERROR BITS
ICPBEG: ; Tovar says this is the right thing to do - MRC
PJOB X2, ; GET JOB #
TIMER X1, ; GET A "RANDOM" VALUE
ANDI X1,377770 ; BUT INSURE ONLY A HALFWORD
MOVSS X4,X2 ; RECEIVE SOCKET
ADDI X2,(X1) ; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
ADDI X4,(X1) ; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
; AND ALL SORTS OF RANDOM CRAP HAPPENS.
ADDI X4,1 ; TRANSMIT SOCKET
MOVEI X1,13 ; SAIL'S HOST ADDRESS NUMBER
MOVEM X1,LHOST ; SAVE IT AWAY
INIT DCCHAN,17
SIXBIT /IMP/
0
JRST ICPLUZ
SETZM CONECB
MOVEM X2,CONECB+LSLOC
MOVEI X3,DCHOST
MOVEM X3,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X3,40
MOVEM X3,CONECB+BSLOC
MOVEI X3,DCSOKT
MOVEM X3,CONECB+FSLOC
MTAPE DCCHAN,[
↑D15
BYTE (6) 2,24,0,12,12
] ; TIME OUT CLS, RFNM, RFC, AND INPUT
MTAPE DCCHAN,CONECB
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; NO CONNECTION TO LOGGER
INPUT DCCHAN,[IOWD 1,FRS#
0]
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
MOVE X3,FRS
LSH X3,-4
MOVEM X3,FRS
ADDI X3,1
MOVEM X3,FSS#
ADDI X2,2
MOVEM X2,LRS#
ADDI X4,2
MOVEM X4,LSS#
MOVE X1,CONECB+LSLOC
MOVEM X1,TERBLK+LSLOC
MTAPE DCCHAN,TERBLK ; RELEASE LOGGER
INIT DCCHAN,1
SIXBIT /IMP/
XWD DCOBUF,DCIBUF
JRST ICPLUZ
MTAPE DCCHAN,[
↑D15
BYTE (6) 5,24,0,12,0
] ; TIME OUT CLS, RFNM, AND RFC
MOVEI X1,↑D8
DPB X1,[POINT 6,DCIBUF+1,11]
DPB X1,[POINT 6,DCOBUF+1,11]
MOVEM X2,CONECB+LSLOC
MOVEI X3,DCHOST
MOVEM X3,CONECB+HLOC
SETZM CONECB+WFLOC
MOVEI X3,↑D8
MOVEM X3,CONECB+BSLOC
MOVE X3,FSS
MOVEM X3,CONECB+FSLOC
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TRNN X1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO RECEIVE SIDE
CALLR CLSCHK ; SEE IF WE ARE REALLY OPEN
JRST ICPLUZ
AOS CONECB+LSLOC
SOS CONECB+FSLOC
MOVEI X3,↑D8
MOVEM X3,CONECB+BSLOC
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TRNN X1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO SEND SIDE
CALLR CLSCHK
JRST ICPLUZ
MOVEI X3,4
MOVEM X3,CONECB
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TLC X1,300000
TLCN X1,300000
TLNE X1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ
SOS CONECB+LSLOC
CALLR CLSCHK
JRST ICPLUZ
MTAPE DCCHAN,CONECB
MOVE X1,CONECB+STLOC
TLC X1,300000
TLCN X1,300000
TLNE X1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
CALLR CLSCHK
JRST ICPLUZ
RETURN
; HERE WHEN CONNECTION FAILS
ICPLUZ: OUTSTR [ASCIZ/? Cannot establish network connection/]
EXIT
>
; (((↑↑↑)))
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IO,"Z"-100
IDPB IO,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPE FLAGDD
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: IFE F.SAIL,<
MOVE IO,COUT ; CLOSE OUTPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEOC
>
QUIT04: IFE F.SAIL,<
MOVE IO,CINP ; CLOSE INPUT SOCKET
CALL IO,[SIXBIT/IMPUUO/]
JRST NETEIC
>
EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
IFE F.SAIL,<
RELEAS DDCHAN,
SETZM DCDBLK+.IBDEV
MOVEI X1,104
MOVEM X1,DCDBLK+.IBLCL
MOVE X1,DCIBLK+.IBRMT
ADDI X1,2
MOVEM X1,DCDBLK+.IBRMT
MOVE X1,ODAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE X1,DCDBLK+.IBDEV
MOVEM X1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOI2
>
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOI2
MTAPE DDCHAN,[ 15 ;ALLOCATE
1
0
0]
SETZM CONECB
MOVE X1,LRS
ADDI X1,2
MOVEM X1,CONECB+LSLOC
MOVEI X1,DCHOST
MOVEM X1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X1,↑D36
MOVEM X1,CONECB+BSLOC
MOVE X1,FSS
ADDI X1,2
MOVEM X1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOI2
RETURN SKIP,1
>
NETOI2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
IFE F.SAIL,<
RELEAS DDCHAN,
SETZM DCDBLK+.IBDEV
MOVEI X1,105
MOVEM X1,DCDBLK+.IBLCL
MOVE X1,DCOBLK+.IBRMT
ADDI X1,2
MOVEM X1,DCDBLK+.IBRMT
MOVE X1,ODAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE X1,DCDBLK+.IBDEV
MOVEM X1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETOO2
>
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOO2
MTAPE DDCHAN,[ 15 ; ALLOCATE
1
0
0]
SETZM CONECB
MOVE X1,LSS
ADDI X1,2
MOVEM X1,CONECB+LSLOC
MOVEI X1,DCHOST
MOVEM X1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI X1,↑D36
MOVEM X1,CONECB+BSLOC
MOVE X1,FRS
ADDI X1,2
MOVEM X1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOO2
RETURN SKIP,1
>
NETOO2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
IFE F.SAIL,<
STATZ DDCHAN,400000
RETURN
>
IFN F.SAIL,<
MOVEI 3 ; TERMINATE CONNECTION
MOVEM CONECB
SETOM CONECB+WFLOC ; WAIT FOR CLS REC'VD
MTAPE DDCHAN,CONECB ; CLOSE IT
>
RELEAS DDCHAN,
IFE F.SAIL,<
MOVE X1,CDAT
CALL X1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG: BEGINR <IO>
NETMS1: MOVE IO,DCIBUF+2 ; CHECK FOR CRUFT READ BUT STILL
CAILE IO,1 ; NOT INPUT BY DFTP
JRST NETMS2 ; YUP THERE IS INPUT
HRRZ IO,DCIBUF
HRRZ IO,(IO)
SKIPGE (IO)
JRST NETMS2
IFN F.SAIL,< MTAPE DCCHAN,[10]>
IFE F.SAIL,< STATO DCCHAN,002000>
RETURN SKIP,1
NETMS2: DCBIN <IO>
CAIN IO,"?"
JRST DEATH
CAIN IO,"!"
JRST NETMS3
CAIN IO,"+"
JRST NETMS4
CAIN IO,"-"
JRST NETMS4
CALLR RENLIN
JRST NETMS1
NETMS3: CALLR RENLIP
JRST NETMS1
NETMS4: CALLR RENLIP
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104>
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105>
ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI: BEGINR
SETO X1,
CAMN X1,FSBUF
JRST NETFI0
CAMN X1,ESBUF
JRST NETFI0
JRST NETFI1
NETFI0: TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
NETFI1: SKIPN GBUF1
JRST NETFI2
MOVE X1,[POINT 6,LFILE]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
NETFI2: SKIPN GBUF2
RETURN
MOVE X1,[POINT 6,LFILE+1]
MOVEI X2,3
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPE FLAGDD
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IO,BP>
SKIPE FLAGDD
OUTSTR (X1)
MOVEI BP,(X1)
HRLI BP,(POINT 7,)
NUTMOL: ILDB IO,BP
JUMPE IO,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IO,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD: BEGINR <IO,UTIL>
MOVE X1,DCIBUF+1
MOVE UTIL,DCIBUF+2
NUTDDL: SOJL UTIL,RETN(0)
ILDB IO,X1
JUMPE IO,NUTDDL
TTCALL 1,IO
JRST NUTDDL
ENDR
; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
; IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB: BEGINR
HLRE X1,IO
SKIPGE X1
MOVN X1,X1
HRRZI X2,(IO)
SKIPE DDIBUF+2
JRST NUTFB2
NUTFB1:
IFE F.SAIL,<
SKIPL IO
JRST NUTFB$
STATZ DDCHAN,020000
RETURN
MOVE X3,DCDBLK+.IBDEV
MOVEM X3,WRKBLK+.IBDEV
MOVE X3,DCDBLK+.IBLCL
MOVEM X3,WRKBLK+.IBLCL
MOVE X3,SWRK
CALL X3,[SIXBIT/IMPUUO/]
JRST .+3
LDB X3,[000600,,WRKBLK+.IBSTT]
JUMPE X3,RETN(0)
NUTFB$:
>
IN DDCHAN,
JRST NUTFB2
SKIPL IO
THUD
STATO DDCHAN,020000
THUD
RETURN
NUTFB2: HRRZ X3,DDIBUF+1
HRLI X2,1(X3)
MOVEI X3,(X1)
CAMLE X3,DDIBUF+2
MOVE X3,DDIBUF+2
ADDI X3,-1(X2)
BLT X2,(X3)
CAMG X1,DDIBUF+2
JRST NUTFB3
SUB X1,DDIBUF+2
MOVEI X2,1(X3)
JRST NUTFB1
NUTFB3: ADDM X1,DDIBUF+1
MOVE X2,DDIBUF+2
SUBI X2,(X1)
MOVEM X2,DDIBUF+2
SKIPL IO
RETURN
ENDR SKIP,1
; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD: TTCALL 3,[ASCIZ / ?? Restart failure ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? Input socket listen failure ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? Output socket listen failure ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP failure (transfer) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP failure (file control) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IO,CICP
CALL IO,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? Input failure (connection) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? Output failure (connection) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? File control failure ??/]
JRST QUIT03
>
; (((↑↑↑)))
NETEIT: TTCALL 3,[ASCIZ / ?? Input failure (transfer) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? Output failure (transfer) ??/]
JRST QUIT
; (((SAIL)))
IFE F.SAIL,<
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
>
; (((↑↑↑)))
;(((SAIL)))
IFN F.SAIL,<
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME
CLSCHK: BEGINR
MTAPE DCCHAN,STTBLK
MOVE X1,STTBLK+1
IOR X1,STTBLK+2
STATO DCCHAN,ERRBTS
TLNN X1,060000
RETURN SKIP,1
ENDR
>
;(((↑↑↑↑)))
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR <IO>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
IFE F.SAIL,<
LOOKUP LFCHAN,LFILEB ; PREPARE FILE FOR INPUT
>
IFN F.SAIL,< ; SAIL DOES NOT HAVE EXTENDED LOOKUP
MOVE IO,LFIPPN
MOVEM IO,LFILE+3 ; MUST CLEAR FOR SAIL PPN'S
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
>
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? Local channel OPEN failure ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found)
/]
RELEAS LFCHAN,
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR <IO,<IO+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IO,<LFILE+1>
MOVE <IO+1>,<LFILE+2>
SETZM LFILE+3
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IO,<LFILE+1>
MOVEM <IO+1>,<LFILE+2>
IFE F.SAIL,<
ENTER LFCHAN,LFILEB ; PREPARE FILE FOR OUTPUT
>
IFN F.SAIL,< ; NO EXTENDED ENTER ON SAIL
MOVE IO,LFIPPN
MOVEM IO,LFILE+3
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
>
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ/ (Local file creation failure)
/]
RELEAS LFCHAN,
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
SKIPE FLAGFE
RETURN
RELEAS LFCHAN,
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IO -- SIZE IN WORDS
;
LOCS: BEGINR
IFE F.SAIL,<
MOVE IO,LFILE+3 ; SIZE IN WORDS FROM EXTENDED LOOKUP
>
IFN F.SAIL,< ; SAIL HAS A FULL WORD SWAPPED -LENGTH(HOW SEXY!!!)
MOVS IO,LFILE+3 ; - LENGTH
MOVNS IO ; + LENGTH
> ; DON'T YOU WISH BOTTOMS-10 WERE SMART LIKE THIS?
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR <IO>
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
SETO X1,
CAMN X1,FSBUF
JRST LOCFI0
CAMN X1,ESBUF
JRST LOCFI0
JRST LOCFI5
LOCFI0: SETZM LUTDSP
LOCFI1: CALLR LUTDS
JRST .+2
JRST .+3
TTCALL 3,[ASCIZ/ (No Such File)
/]
RETURN
SETO X1,
CAME X1,FSBUF
JRST LOCFI2
CAME X1,ESBUF
JRST LOCFI3
JRST LOCFI4
LOCFI2: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X3,X1
ILDB X4,X2
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCFI1
JUMPE X4,LOCFI4
CAIN X4,"."
JRST LOCFI4
JRST LOCFI1
LOCFI3: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X4,X2
JUMPE X4,.+4
CAIE X4,"."
JRST .-3
ILDB X4,X2
ILDB X3,X1
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCFI1
JUMPE X4,LOCFI4
JRST LOCFI1
LOCFI4: HRRZI IO,LUTDSF
CALLR LUTFN
LOCFI5: CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR <IO>
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST LOCNI0
CAMN X1,ESBUF
JRST LOCNI0
RETURN SKIP,1
LOCNI0: CALLR LUTDS
RETURN SKIP,1
SETO X1,
CAME X1,FSBUF
JRST LOCNI1
CAME X1,ESBUF
JRST LOCNI2
JRST LOCNI3
LOCNI1: MOVE X1,[POINT 7,FSBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X3,X1
ILDB X4,X2
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCNI0
JUMPE X4,LOCNI3
CAIN X4,"."
JRST LOCNI3
JRST LOCNI0
LOCNI2: MOVE X1,[POINT 7,ESBUF]
MOVE X2,[POINT 7,LUTDSF]
ILDB X4,X2
JUMPE X4,.+4
CAIE X4,"."
JRST .-3
ILDB X4,X2
ILDB X3,X1
JUMPE X3,.+4
CAIN X3,(X4)
JRST .-4
JRST LOCNI0
JUMPE X4,LOCNI3
JRST LOCNI0
LOCNI3: HRRZI IO,LUTDSF
CALLR LUTFN
CALLR LOCOI
JRST LOCNI0
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,LUTDSF
TTCALL 3,[ASCIZ/)
/]
SKIPN GBUF1
JRST LOCNI4
MOVE X1,[POINT 6,LFILE]
MOVEI X2,6
MOVE X3,[POINT 7,FBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
LOCNI4: SKIPN GBUF2
RETURN
MOVE X1,[POINT 6,LFILE+1]
MOVEI X2,3
MOVE X3,[POINT 7,EBUF]
ILDB X4,X1
SKIPE X4
ADDI X4,40
IDPB X4,X3
SOJG X2,.-4
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR <IO>
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,ABUF]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNO0: MOVEI IO,ABUF
CALLR LUTFN
TTCALL 3,[ASCIZ/ (/]
TTCALL 3,ABUF
TTCALL 3,[ASCIZ/)
/]
ENDR
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IO,BP,UTIL>
HRRI BP,(IO)
HRLI BP,(POINT 7,)
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
IFN F.SAIL,<SETZM LFILE+3>
MOVEI X1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI X2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IO,BP
JUMPE IO,RETN(0)
CAIN IO,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IO,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IO,77 ; AND REMOVAL OF HIGH BITS
XCT (X1) ; EXECUTE THE PROPER ROTATE
IORM IO,(X2) ; IOR RESULT INTO FILE OR FILE+1
AOJ X1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN X2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI X1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI X2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IO,-6 ; HIGH ORDER
ROT IO,-14
ROT IO,22
ROT IO,14
ROT IO,6
ROT IO,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
LUTDS1: JSP X1,LUTDSI
JUMPE X2,[ JSP X1,LUTDSI
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI>
>
; (((↑↑↑)))
JRST LUTDS1] ; IGNORE HOLES IN DIRECTORY
MOVE X3,[POINT 7,LUTDSF]
LUTDS2: SETZ X1,
LSHC X1,6
ADDI X1," "
IDPB X1,X3
JUMPN X2,LUTDS2
MOVEI X1,"."
IDPB X1,X3
JSP X1,LUTDSI
ANDCMI X2,-1
LUTDS3: SETZ X1,
LSHC X1,6
ADDI X1," "
IDPB X1,X3
JUMPN X2,LUTDS3
SETZ X1,
IDPB X1,X3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI> ;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
RETURN SKIP,1
LUTDSI: SOSG LDIBUF+2
IN LDCHAN,
CAIA
JRST LUTDSD
ILDB X2,LDIBUF+1
JRST (X1)
LUTDSS: RELEAS LDCHAN,
MOVE X1,LFIPPN
MOVEM X1,LDIR
MOVE X1,LFCHAS+1
MOVEM X1,LDCHAS+1
MOVE X1,[SIXBIT/UFD/]
MOVEM X1,LDIR+1
SETZM LDIR+2
IFE F.SAIL,<MOVE X1,[1,,1]>
IFN F.SAIL,<MOVE X1,[SIXBIT/ 1 1/]>
MOVEM X1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
SETOM LUTDSP
JRST LUTDS1
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ/ ?? Local directory failure ??
/]
RELEAS LDCHAN,
ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
; IN: IO -- DATE INTEGER
; UTIL -- TIME INTEGER
; BP -- BYTE POINTER TO DESTINATION STRING
; OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
MOVE X1,IO
IDIVI X1,↑D31
MOVEI X3,(X1)
MOVEI X1,1(X2)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1,"-"
IDPB X1,BP
MOVEI X1,(X3)
IDIVI X1,↑D12
MOVEI X3,(X1)
HRRI X1,LUTTM(X2)
HRLI X1,(POINT 7,)
SCOPY (X1,BP)
MOVEI X1,"-"
IDPB X1,BP
MOVEI X1,↑D64(X3)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1," "
IDPB X1,BP
MOVE X1,UTIL
IDIVI X1,↑D60
MOVEI X3,(X2)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
MOVEI X1,":"
IDPB X1,BP
MOVEI X1,(X3)
IDIVI X1,↑D10
ADDI X1,"0"
ADDI X2,"0"
IDPB X1,BP
IDPB X2,BP
SETZ X1,
IDPB X1,BP
ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
; IN: IO -- ADDRESS OF TIME STRING
; OUT: IO -- DATE INTEGER
; UTIL -- TIME INTEGER
;
LUTTSN: BEGINR <BP>
MOVE BP,IO
SETZ IO,
SETZ UTIL,
ILDB X1,BP
CAIL X1,"0"
CAILE X1,"9"
RETURN
MOVEI X4,-"0"(X1)
IMULI X4,↑D10
ILDB X1,BP
ADDI X4,-"0"(X1)
ILDB X1,BP
CAIE X1,"-"
RETURN
MOVE X3,[POINT 7,X2]
SETZ X2,
ILDB X1,BP
IDPB X1,X3
ILDB X1,BP
IDPB X1,X3
ILDB X1,BP
IDPB X1,X3
MOVEI X3,↑D11
CAMN X2,LUTTM(X3)
JRST .+3
SOJGE X3,.-2
RETURN
ILDB X1,BP
CAIE X1,"-"
RETURN
ILDB X1,BP
MOVEI X2,-"0"(X1)
IMULI X2,↑D10
ILDB X1,BP
ADDI X2,-"0"(X1)
SUBI X2,↑D64
IMULI X2,↑D12
ADDI X2,(X3)
IMULI X2,↑D31
ADDI X2,-1(X4)
ILDB X1,BP
CAIE X1," "
RETURN
ILDB X1,BP
MOVEI X3,-"0"(X1)
IMULI X3,↑D10
ILDB X1,BP
ADDI X3,-"0"(X1)
IMULI X3,6
ILDB X1,BP
CAIE X1,":"
RETURN
ILDB X1,BP
ADDI X3,-"0"(X1)
IMULI X3,↑D10
ILDB X1,BP
ADDI X3,-"0"(X1)
MOVE IO,X2
MOVE UTIL,X3
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS: MOVE IO,[IN DDCHAN,]
CAMN IO,-3(FLAG)
JRST IOERDD
MOVE IO,[OUT DDCHAN,]
CAMN IO,-3(FLAG)
JRST IOERDD
MOVE IO,[IN LFCHAN,]
CAMN IO,-3(FLAG)
JRST IOERLF
MOVE IO,[OUT LFCHAN,]
CAMN IO,-3(FLAG)
JRST IOERLF
TTCALL 3,[ASCIZ/ ?? Impossible event at /]
MOVEI IO,-1(FLAG)
TNOUT (IO,10)
TTCALL 3,[ASCIZ / ??/]
EXIT
IOERDD: GETSTS DDCHAN,ABUF
JRST .+2
IOERLF: GETSTS LFCHAN,ABUF
TTCALL 3,[ASCIZ/ ?? Data error at /]
MOVEI IO,-3(FLAG)
TNOUT (IO,10)
TTCALL 3,[ASCIZ/ with status /]
MOVE IO,ABUF
TNOUT (IO,10)
TTCALL 3,[ASCIZ / ??
/]
SETOM FLAGDE
CALLR RENDER
JRST QUIT
JRST QUIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE X1,[SIXBIT/DFTP/]
SETNM
HRRZI X1,-1
RFMOD
TRZ X2,006000 ; (1B24+1B25)
SFMOD
MOVE X2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE X3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI X1,400000 ; FOR THIS FORK
MOVE X2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE X1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI X1,400000 ; FOR THIS FORK
MOVE X2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
AIC ; ACTIVATE CHANNELS
SETZM FLAGCO
SETZM FLAGEF
CALLR ICP
ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL: BEGINR <BP,UTIL>
MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVEM X3,NTIME
MOVE X1,DCDJFN
MOVE X2,[444400,,FBUF]
MOVNI X3,GET$F
SETOM FLAGEF
SIN
SKIPN FLAGEF
RETURN
SETZM FLAGEF
MOVEI BP,GET$F
MOVEM BP,NSIZE
SETZ UTIL,
ADD UTIL,<FBUF-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,EBUF]
MOVNI X3,GET$E
SIN
MOVEI BP,GET$E
ADDM BP,NSIZE
SETZ UTIL,
ADD UTIL,<EBUF-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,GET$D
SIN
MOVEI BP,GET$D
ADDM BP,NSIZE
SETZ UTIL,
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDM UTIL,NSUM
MOVE X1,[POINT 7,PAGE]
SETZ X2,
IDTIM
SETZ X2,
MOVEM X2,ABUF
MOVE X1,DCDJFN
BIN
AOS NSIZE
ADDM X2,NSUM
MOVEM X2,<ABUF+1>
BIN
AOS NSIZE
ADDM X2,NSUM
MOVEM X2,<ABUF+2>
ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT: BEGINR <IO,BP,UTIL>
SETZ UTIL,
MOVE X1,DCDJFN
BIN
ADDM X2,NSUM
MOVN IO,X2
ADDI X2,3
ADDM X2,NSIZE
JUMPE IO,GETD2
GETD1: CALLR NETMSG
JRST GETD7
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SIN
HRRZ X1,LJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SKIPN FLAGFE
SOUT
MOVN BP,IO
CAILE BP,SIZPAG
MOVEI BP,SIZPAG
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDI IO,SIZPAG
JUMPL IO,GETD1
GETD2: MOVE X1,DCDJFN
BIN
ADD UTIL,X2
ADDM UTIL,NSUM
BIN
ADDM X2,NSUM
CAMN X2,UTIL
JRST GETD3
TSOUT <[ASCIZ/ (File checksum error)/],CRLF>
GETD3: SKIPE FLAGFE
JRST GETD8
HRROI X1,LFILE
HRRZ X2,LJFN
MOVE X3,[022220,,000001]
JFNS
CALLR LOCC
SETO X1,
CAMN X1,FSBUF
JRST GETD4
CAMN X1,ESBUF
JRST GETD4
CAMN X1,VSBUF
JRST GETD4
JRST GETD5
GETD4: HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
GETD5: CALLR LOCOI
JRST GETD8
MOVE X3,<ABUF+2>
JUMPLE X3,GETD6
HRR X1,LJFN
HRLI X1,11 ; OFFSET 11
HRLZI X2,007700 ; BYTESIZE (B6-B11)
LSH X3,30
CHFDB
HRR X1,LJFN
HRLI X1,12 ; OFFSET 12 (BYTE COUNT)
SETO X2,
MOVE X3,<ABUF+1>
CHFDB
GETD6: SKIPN ABUF
JRST GETD8
MOVEI X1,400000
RPCAP
TRNN X2,600000 ; (1B18+1B19) WHEEL OR OPER
JRST GETD8
MOVE UTIL,X3
TRO X3,(X2)
EPCAP ; ENABLE (!)
HRR X1,LJFN
HRLI X1,14 ; OFFSET 14 (LAST WRITE)
SETO X2,
MOVE X3,ABUF
CHFDB
MOVEI X1,400000
MOVE X3,UTIL
EPCAP ; RESET CAPABILITIES
JRST GETD8
GETD7: MOVE X1,DCDJFN
SIBE
JRST .+2
JRST GETD8
BIN
JRST .-4
GETD8: MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVE X2,NTIME
SUB X3,X2
MOVEM X3,NTIME
ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL: BEGINR <BP,UTIL>
MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVEM X3,NTIME
MOVE BP,[POINT 7,PAGE]
MOVE UTIL,[POINT 7,FBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
MOVE UTIL,[POINT 7,EBUF]
SCOPY (UTIL,BP)
MOVE BP,UTIL
HRRZ X1,LJFN
MOVE X2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI X3,UBUF1
GTFDB
JRST PUTF1
SETZ X1,
IDPB X1,BP
JRST PUTF2
PUTF1: MOVE X1,BP
MOVE X2,UBUF1
SETZ X3,
ODTIM
IBP X1
MOVE BP,X1
PUTF2: GTAD
MOVE X2,X1
MOVE X1,BP
ODTIM
IBP X1
MOVEI BP,(X1)
MOVE UTIL,VBUF
MOVEM UTIL,1(BP)
ADDI BP,1
HRRZ X1,LJFN
MOVE X2,[2,,11] ; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
HRRZI X3,UBUF1
GTFDB
JRST PUTF3
SETZM UBUF1
SETZM <UBUF1+1>
PUTF3: MOVE UTIL,<UBUF1+1>
MOVEM UTIL,1(BP)
LDB UTIL,[300600,,UBUF1]
MOVEM UTIL,2(BP)
ADDI BP,2
MOVEI UTIL,1(BP)
SUBI UTIL,PAGE
MOVEM UTIL,NSIZE
MOVEI BP,-1(UTIL)
SETZ UTIL,
ADD UTIL,PAGE(BP)
SOJGE BP,.-1
ADDM UTIL,NSUM
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVN X3,NSIZE
SOUT
ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT: BEGINR <IO,BP,UTIL>
CALLR LOCS
MOVE X1,DCDJFN
MOVE X2,IO
BOUT
ADDM X2,NSUM
ADDI X2,2
ADDM X2,NSIZE
MOVN IO,IO
SETZ UTIL,
JUMPE IO,PUTD2
PUTD1: HRRZ X1,LJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SIN
CALLR NETMSG
JRST PUTD3
MOVE X1,DCDJFN
MOVE X2,[444400,,PAGE]
MOVNI X3,SIZPAG
CAMGE X3,IO
MOVE X3,IO
SOUT
MOVN BP,IO
CAILE BP,SIZPAG
MOVEI BP,SIZPAG
ADD UTIL,<PAGE-1>(BP)
SOJG BP,.-1
ADDI IO,SIZPAG
JUMPL IO,PUTD1
PUTD2: MOVE X1,DCDJFN
MOVE X2,UTIL
BOUT
ADDM UTIL,NSUM
ADDM UTIL,NSUM
MOVEI X2,21
MTOPR
PUTD3: MOVEI X1,400000
RUNTM
IDIV X3,X2
MOVE X2,NTIME
SUB X3,X2
MOVEM X3,NTIME
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:20./]
SETZ X3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN X2,DCSOCK
NOUT
JRST .+1
HRLZI X1,1 ; SHORT GTJFN
HRROI X2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE X2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM X2,ICPSOC
CLOSF
JRST ICPEC
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:22./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM X1,DCOJFN
HRLZI X1,1
HRROI X2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM X1,DCIJFN
MOVE X2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE X1,DCOJFN
MOVE X2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE X1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM X1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE X1,DCOJFN
MOVEI X2,"Z"-100
BOUT
MOVEI X2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IO>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:24./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
SUBI X2,3
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN
JRST NETOI2
MOVEM X1,DCDJFN
MOVE X2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE X1,[POINT 7,UBUF1]
HRROI X2,[ASCIZ/NET:25./]
SETZ X3,
SOUT
MOVEI X2,DCHOST
MOVEI X3,10
CVHST
NOUT
JRST .+1
MOVN X2,ICPSOC
SUBI X2,2
NOUT
JRST .+1
HRLZI X1,1
HRROI X2,UBUF1
GTJFN
JRST NETOO2
MOVEM X1,DCDJFN
MOVE X2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE X1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ/ ?? Network connection CLOSE failure ??
/]
PSOUT
ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG: BEGINR
NETMS1: MOVE X1,DCIJFN
SIBE
JRST .+2
RETURN SKIP,1
BIN
CAIN X2,"!"
JRST NETMS2
CAIN X2,"+"
JRST NETMS3
CAIN X2,"-"
JRST NETMS3
CAIN X2,"?"
JRST DEATH
CALLR RENLIN
JRST NETMS1
NETMS2: CALLR RENLIP
JRST NETMS1
NETMS3: CALLR RENLIP
ENDR
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
; OUT: UTIL
;
NETDSI: BEGINR
GJINF
HRRZI UTIL,(X2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
; OUT: UTIL
;
NETDSO: BEGINR
GJINF
HRRZI UTIL,(X2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI: BEGINR
MOVE X2,LJFN
TLNN X2,770000
JRST NETFI1
HRROI X1,LFILE
HRRZI X2,(X2)
SETZ X3,
JFNS
HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
NETFI1: SKIPN GBUF1
JRST NETFI2
HRROI X1,FBUF
HRRZ X2,LJFN
HRLZI X3,002000
JFNS
NETFI2: SKIPN GBUF2
JRST NETFI3
HRROI X1,EBUF
HRRZ X2,LJFN
HRLZI X3,000200
JFNS
NETFI3: SKIPL VSBUF
RETURN
MOVN X1,VBUF
MOVEM X1,VSBUF
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI X1,[ASCIZ/ The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI X1,[ASCIZ/ The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI X1,[ASCIZ/ ?? ICP CLOSF failure ??/]
JRST NETEQ
ICPEOG: HRROI X1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
JRST NETEQ
ICPEIG: HRROI X1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
JRST NETEQ
ICPEIO: HRROI X1,[ASCIZ/ ?? ICP output OPENF failure ??/]
JRST NETEQ
ICPEOO: HRROI X1,[ASCIZ/ ?? ICP input OPENF failure ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI X1,100101 ; OLD FILE, *'S, SHORT CALL
MOVE X2,[POINT 7,LFILE]
GTJFN
JRST LOCOI1
MOVEM X1,LJFN
HRRZI X1,(X1)
MOVE X2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI X1,[ASCIZ/ (Local file not found)
/]
PSOUT
RETURN
LOCOI2: HRROI X1,[ASCIZ/ (Local file not available)
/]
PSOUT
HRRZ X1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI X1,600001 ; VN, WRITE, SHORT
MOVE X2,[POINT 7,LFILE]
GTJFN
JRST LOCOO2
MOVEM X1,LJFN
MOVE X2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: HRRZ X1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI X1,[ASCIZ/ (Local file creation failure)
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
SKIPE FLAGFE
RETURN
HRRZ X1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI X1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: IO -- SIZE IN WORDS
;
LOCS: BEGINR
HRRZ X1,LJFN
MOVE X2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI X3,UBUF1
GTFDB
JRST .+3
SETZ IO,
RETURN
LDB X1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI X2,↑D36
IDIVI X2,(X1) ; BYTES/WD
MOVE X3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI X3,-1(X2) ; ACCOUNT FOR TRUNCATION
IDIVI X3,(X2) ; NUMBER OF WORDS
MOVE IO,X3
ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI: BEGINR
SETZM GBUF1
LDB X1,[350700,,FBUF]
CAIN X1,"*"
SETOM GBUF1
SETZM GBUF2
LDB X1,[350700,,EBUF]
CAIN X1,"*"
SETOM GBUF2
CALLR LOCOI
RETURN
CALLR LOCC
ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI: BEGINR
HRRZ X1,LJFN
TLO X1,400000
CLOSF
JRST .+1
LOCNI1: MOVE X1,LJFN
GNJFN
RETURN SKIP,1
HRRZI X1,(X1)
MOVE X2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCNI1
SKIPL VSBUF
JRST LOCNI2
MOVE X1,[LFILE,,UBUF1]
BLT X1,<UBUF1+SBSIZE-1>
LOCNI2: HRROI X1,LFILE
HRRZ X2,LJFN
SETZ X3,
JFNS
HRROI X1,[ASCIZ/ /]
PSOUT
HRROI X1,LFILE
PSOUT
HRROI X1,CRLF
PSOUT
SKIPL VSBUF
JRST LOCNI5
MOVE X1,[440700,,LFILE]
MOVE X2,[440700,,UBUF1]
LOCNI3: ILDB X3,X1
ILDB X4,X2
CAIE X3,(X4)
JRST LOCNI4
CAIE X3,";"
JUMPN X3,LOCNI3
AOS VBUF
JRST LOCNI5
LOCNI4: MOVN X1,VSBUF
MOVEM X1,VBUF
LOCNI5: SKIPN GBUF1
JRST LOCNI6
HRROI X1,FBUF
HRRZ X2,LJFN
HRLZI X3,002000
JFNS
LOCNI6: SKIPN GBUF2
RETURN
HRROI X1,EBUF
HRRZ X2,LJFN
HRLZI X3,000200
JFNS
RETURN
ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO: BEGINR
SETZ X1,
SETO X2,
CAMN X2,FSBUF
TRO X1,400000
CAMN X2,ESBUF
TRO X1,200000
CAMN X2,VSBUF
TRO X1,100000
JUMPE X1,RETN(0)
MOVE X2,[POINT 7,LFILE]
MOVE X3,[POINT 7,FSBUF]
TRNE X1,400000
HRRI X3,FBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
SKIPN ESBUF
JRST LOCNO0
MOVEI X4,"."
DPB X4,X2
MOVE X3,[POINT 7,ESBUF]
TRNE X1,200000
HRRI X3,EBUF
ILDB X4,X3
CAIN X4," "
SETZ X4,
IDPB X4,X2
JUMPN X4,.-4
LOCNO0: SKIPG VSBUF
RETURN
MOVEI X4,";"
DPB X4,X2
MOVE X1,X2
MOVE X2,VSBUF
MOVEI X3,↑D10
NOUT
THUD
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: MOVE UTIL,X1
HRROI X1,[ASCIZ/ ?? Unexpected EOF at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVE X1,(X2)
CAMN X1,[BIN]
JRST EOFPSD
CAMN X1,[BOUT]
JRST EOFPSD
CAMN X1,[SIN]
JRST EOFPSD
CAMN X1,[SOUT]
JRST EOFPSD
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
EOFPSD: CAMN UTIL,DCDJFN
JRST .+4
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
SETOM FLAGDE
CALLR RENDER
JRST .+1
MOVEI X1,QUIT
MOVEM X1,PSIPC1
DEBRK
DERPSI: MOVE UTIL,X1
HRROI X1,[ASCIZ/ ?? Data error at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVE X1,(X2)
CAMN X1,[BIN]
JRST DERPSD
CAMN X1,[BOUT]
JRST DERPSD
CAMN X1,[SIN]
JRST DERPSD
CAMN X1,[SOUT]
JRST DERPSD
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
DERPSD: CAMN UTIL,DCDJFN
JRST .+4
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
SETOM FLAGDE
CALLR RENDER
JRST .+1
MOVEI X1,QUIT
MOVEM X1,PSIPC1
DEBRK
ILIPSI: HRROI X1,[ASCIZ/ ?? Illegal instruction at /]
CAMN X2,[-1]
HRROI X1,[ASCIZ/ ?? Impossible event at /]
PSOUT
MOVEI X1,101
HRRZ X2,PSIPC1
SUBI X2,1
MOVEI X3,10
SETZ X4,
NOUT
JRST .+1
HRROI X1,[ASCIZ/ ??
/]
PSOUT
MOVEI X1,PSIQUI
MOVEM X1,PSIPC1
DEBRK
PSIQUI: HALTF
JRST PSIQUI
>
; (((↑↑↑)))
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)";",15,12,0,0
HOSTS: 5,,[ASCIZ/BBN/] ; TENEXE
11,,[ASCIZ/HARVARD/]
13,,[ASCIZ/SUAI/]
37,,[ASCIZ/CCA/]
40,,[ASCIZ/PARC/]
43,,[ASCIZ/ISI/] ; ISIR1
53,,[ASCIZ/OFFICE"-1/]
56,,[ASCIZ/RUTGERS/]
61,,[ASCIZ/BBN/] ; TENEXB
62,,[ASCIZ/BBN/] ; TENEXF
70,,[ASCIZ/SUMEX/]
102,,[ASCIZ/SRI/]
106,,[ASCIZ/ITS/] ; DMS
126,,[ASCIZ/ISI/] ; ISIA
161,,[ASCIZ/BBN/] ; TENEXD
164,,[ASCIZ/ISI/] ; ISIE
206,,[ASCIZ/ITS/] ; AI
226,,[ASCIZ/ISI/] ; ISIC
305,,[ASCIZ/BBN/] ; TENEXA
306,,[ASCIZ/ITS/] ; ML
326,,[ASCIZ/ISI/] ; ISID
354,,[ASCIZ/ITS/] ; MC
361,,[ASCIZ/BBN/] ; TENEXC
364,,[ASCIZ/ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((ITS)))
IFL F.TENX,<
IOBUFR: BLOCK 2000
LCLDEV: BLOCK 1 ; local device
LCLFN1: BLOCK 1
LCLFN2: BLOCK 1
LCLSNM: BLOCK 1 ; SNAME
RCHBLK: BLOCK 10 ; network status goes here
LCLRCV: BLOCK 1
LCLTRN: BLOCK 1
FORRCV: BLOCK 1
FORTRN: BLOCK 1
FFITYP: BLOCK 1
LCLDAT: BLOCK 1
DIRBLK: BLOCK 2000
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
IFE F.SAIL,<
LFILEB: 0,,5 ; EXTENDED LOOKUP-ENTER
>
LFIPPN: 0 ; PPN
LFILE: 0 ; FILE NAME
0 ; EXTENSION AND DATES
0 ; MODE AND DATES
0 ; SIZE IN WORDS
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
LUTDSF: BLOCK SBSIZE
; (((SAIL)))
IFN F.SAIL,<
CONECB: BLOCK 7
; OTHER RANDOM THINGS
TERBLK: 3 ; TERMINATE BLOCK
0 ; STATUS BITS
1 ; FOREIGN SOCKET LOC
0 ; DON'T WAIT
STTBLK: 2
BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
1,,DERPSI
REPEAT 3,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBSIZE
LJFN: 0
LDIR: 0
VSBUF: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
; * VARIABLES
VAR
CMDMOD: 0
LHOST: 0
ANCHOR: ASCIZ /DFTP/
BLOCK <SBSIZE-2>
CONTEX: BLOCK LBSIZE
OPENED: BLOCK LBSIZE
OPENEM: 0
FLAGDD: 0
FLAGDE: 0
FLAGFE: 0
FLAGNN: 0
FLAGTT: 0
; * BLOCKS
NBUF: BLOCK LBSIZE
FBUF: BLOCK SBSIZE
EBUF: BLOCK SBSIZE
VBUF: 0
FSBUF: BLOCK SBSIZE
ESBUF: BLOCK SBSIZE
ABUF: BLOCK SBSIZE
UBUF1: BLOCK LBSIZE
UBUF2: BLOCK SBSIZE
GBUF1: BLOCK LBSIZE
GBUF2: BLOCK LBSIZE
NTIME: 0
NSIZE: 0
NSUM: 0
TCIPCL: BLOCK 100 ; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP: 0 ; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
BLOCK 37 ; (SIZE = # CHARS IN LARGEST CMD)
TCIPNF: 0 ; P(OSSIBLE)N(EXT)F(REE)
STSIZ==100
STBEG: BLOCK STSIZ
-1 ; CRETINOUS LINK-10 BUG
END DFTP
β